ดังกล่าวโดย Chris Fritz (Vue.js Core Team Emeriti ) ในVueCONF US 2019
ถ้าเรามี Kia เข้า.native
แล้วองค์ประกอบรากของอินพุตพื้นฐานเปลี่ยนจากอินพุตเป็นฉลากโดยฉับพลันส่วนประกอบนี้ขาดและไม่ชัดเจนและในความเป็นจริงคุณอาจไม่ได้จับทันทีถ้าคุณมีการทดสอบที่ดีจริงๆ แต่โดยการหลีกเลี่ยงการใช้.native
ตัวปรับแต่งซึ่งปัจจุบันฉันคิดว่ารูปแบบการต่อต้านจะถูกลบใน Vue 3คุณจะสามารถกำหนดได้อย่างชัดเจนว่าผู้ปกครองอาจสนใจว่าองค์ประกอบใดที่ผู้ฟังจะถูกเพิ่มลงใน ...
ด้วย Vue 2
การใช้ $listeners
:
ดังนั้นหากคุณใช้ Vue 2 ตัวเลือกที่ดีกว่าในการแก้ไขปัญหานี้คือการใช้ตรรกะของwrapper ที่โปร่งใส สำหรับ Vue นี้จัดเตรียม$listeners
คุณสมบัติที่มีอ็อบเจ็กต์ของ listeners ที่ถูกใช้บนคอมโพเนนต์ ตัวอย่างเช่น:
{
focus: function (event) { /* ... */ }
input: function (value) { /* ... */ },
}
แล้วเราก็ต้องเพิ่มv-on="$listeners"
เข้าไปtest
องค์ประกอบที่ชอบ:
Test.vue (องค์ประกอบลูก)
<template>
<div v-on="$listeners">
click here
</div>
</template>
ตอนนี้<test>
คอมโพเนนต์เป็นwrapper โปร่งใสอย่างสมบูรณ์ซึ่งหมายความว่าสามารถใช้งานได้เหมือนกับ<div>
องค์ประกอบปกติ: ผู้ฟังทั้งหมดจะทำงานได้โดยไม่ต้องใช้.native
ตัวปรับ
การสาธิต:
Vue.component('test', {
template: `
<div class="child" v-on="$listeners">
Click here
</div>`
})
new Vue({
el: "#myApp",
data: {},
methods: {
testFunction: function(event) {
console.log('test clicked')
}
}
})
div.child{border:5px dotted orange; padding:20px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="myApp">
<test @click="testFunction"></test>
</div>
การใช้ $emit
วิธีการ:
นอกจากนี้เรายังสามารถใช้$emit
วิธีการสำหรับวัตถุประสงค์นี้ซึ่งช่วยให้เราฟังเหตุการณ์องค์ประกอบลูกในองค์ประกอบหลัก สำหรับสิ่งนี้ก่อนอื่นเราต้องปล่อยเหตุการณ์ที่กำหนดเองจากองค์ประกอบย่อยเช่น:
Test.vue (องค์ประกอบลูก)
<test @click="$emit('my-event')"></test>
สำคัญ:ใช้ kebab-case เสมอสำหรับชื่อเหตุการณ์ สำหรับข้อมูลเพิ่มเติมและการสาธิตการลงทะเบียนจุดนี้โปรดดูคำตอบนี้: VueJS ผ่านค่าที่คำนวณได้จากส่วนประกอบไปยังผู้ปกครองผ่านค่าคำนวณจากส่วนประกอบไปยังผู้ปกครอง
ตอนนี้เราเพียงแค่ต้องฟังเหตุการณ์ที่กำหนดเองนี้ที่ปล่อยออกมาในองค์ประกอบหลักเช่น:
App.vue
<test @my-event="testFunction"></test>
ดังนั้นโดยพื้นฐานแล้วแทนที่จะv-on:click
เป็นชวเลข@click
เราจะใช้v-on:my-event
@my-event
หรือเพียงแค่
การสาธิต:
Vue.component('test', {
template: `
<div class="child" @click="$emit('my-event')">
Click here
</div>`
})
new Vue({
el: "#myApp",
data: {},
methods: {
testFunction: function(event) {
console.log('test clicked')
}
}
})
div.child{border:5px dotted orange; padding:20px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="myApp">
<test @my-event="testFunction"></test>
</div>
ด้วย Vue 3
การใช้ v-bind="$attrs"
:
Vue 3 กำลังจะทำให้ชีวิตของเราง่ายขึ้นในหลาย ๆ ด้าน หนึ่งในตัวอย่างของมันคือมันจะช่วยให้เราสร้างwrapper โปร่งใสที่ง่ายขึ้นโดยใช้ config น้อยกว่าเพียงแค่ใช้v-bind="$attrs"
กับการกำหนดค่าน้อยมากโดยเพียงแค่ใช้โดยการใช้สิ่งนี้กับองค์ประกอบย่อยไม่เพียง แต่ผู้ฟังของเราจะทำงานโดยตรงจากผู้ปกครอง แต่ยังมีคุณสมบัติอื่น ๆ ที่จะทำงานเหมือนปกติ<div>
เท่านั้น
ดังนั้นด้วยความเคารพต่อคำถามนี้เราไม่จำเป็นต้องอัปเดตสิ่งใดใน Vue 3 และรหัสของคุณจะยังทำงานได้ดีเช่นเดียว<div>
กับองค์ประกอบหลักที่นี่และมันจะฟังเหตุการณ์ลูกทั้งหมดโดยอัตโนมัติ
การสาธิต # 1:
const { createApp } = Vue;
const Test = {
template: `
<div class="child">
Click here
</div>`
};
const App = {
components: { Test },
setup() {
const testFunction = event => {
console.log("test clicked");
};
return { testFunction };
}
};
createApp(App).mount("#myApp");
div.child{border:5px dotted orange; padding:20px;}
<script src="//unpkg.com/vue@next"></script>
<div id="myApp">
<test v-on:click="testFunction"></test>
</div>
แต่สำหรับองค์ประกอบที่ซับซ้อนที่มีองค์ประกอบซ้อนกันซึ่งเราจำเป็นต้องใช้คุณสมบัติและกิจกรรมกับหลัก<input />
แทนที่จะเป็นป้ายกำกับหลักเราสามารถใช้v-bind="$attrs"
การสาธิต # 2:
const { createApp } = Vue;
const BaseInput = {
props: ['label', 'value'],
template: `
<label>
{{ label }}
<input v-bind="$attrs">
</label>`
};
const App = {
components: { BaseInput },
setup() {
const search = event => {
console.clear();
console.log("Searching...", event.target.value);
};
return { search };
}
};
createApp(App).mount("#myApp");
input{padding:8px;}
<script src="//unpkg.com/vue@next"></script>
<div id="myApp">
<base-input
label="Search: "
placeholder="Search"
@keyup="search">
</base-input><br/>
</div>
@click.native="testFunction"