上一篇已经学会如何把外部元件的资料传到内部元件,如果是内部传到外部,就需要透过emit
来达成。
Props in, Ebent out
:
emit
传递事件emit
除了可以传递资料,也可以只传递事件,来触发外部的事件:
<div id="app">
{{ text }}:
<button type="button" @click="add()">add</button>
{{ num }}
<br>
<br>
<out-text @button-click="add"></out-text>
</div>
const app = Vue.createApp({
data() {
return {
text: "外部元件",
num: 0,
}
},
methods: {
add() {
this.num++;
}
}
});
app.component("outText",{
template: `<button @click="click">emit add</button>`,
data() {
return {
text: "内部元件"
};
},
methods: {
click() {
this.$emit('buttonClick');
}
}
});
app.mount("#app");
emit
起手式:$emit
触发的函式@button-click="add"
跟Props
一样记法前内後外,撰写时可以按照步骤console.log
,会比较顺利完成。
emit
传递参数将内层资料传递到外层元件上使用:
<div id="app">
<h3> {{ title }} </h3>
{{ text }}:
<button type="button" @click="add">add</button>
{{ num }}
<br>
<br>
<out-text @button-click="add"></out-text>
</div>
const app = Vue.createApp({
data() {
return {
title: "",
text: "外部元件",
num: 0,
}
},
methods: {
add(addtext) {
this.num++;
this.title = addtext;
//addtext 没有值传起来就会变成 事件物件 [object PointerEvent]
}
}
});
app.component("outText",{
template: `<button @click="click">emit add</button>`,
data() {
return {
text: "内部元件",
insideText: "内部元件传递文字"
};
},
methods: {
click() {
this.$emit('buttonClick', this.insideText);
}
}
});
app.mount("#app");
因为要带参数所以原本$emit
里要多带一个this.insideText
参数,透过外层模板@button-click="add"
,传递到外层元件的add(addtext)
,最後再传回外层data
渲染画面。
emits
验证<div id="app">
{{ text }}:{{ num }}
<br>
<br>
<out-text @button-click="add"></out-text>
</div>
const app = Vue.createApp({
data() {
return {
text: "外部 num",
num: 0,
}
},
methods: {
add(num) {
this.num = this.num + num;
}
}
});
app.component("outText",{
template: `{{ text }}:<button @click="$emit('buttonClick', num)">emit add</button>`,
data() {
return {
text: "内部元件",
num: 3,
};
},
});
app.mount("#app");
内层元件除了使用methods
的方式撰写emit
,也可以直接写在template
,@click="$emit('buttonClick', num)"
里面的'buttonClick'
就是内层的@button-click
,num
则是内层data
的num
。当我们开启开发者工具Console
,会发现跳出这一段警告:
这是因为无法正确追踪你带入的变数内层的num
,就会跳出这个警告提示,这时只要加上emits:['buttonClick']
就能消除警告。
emits
正确用法是拿来验证事件参数传出去的值,是否符合预期的型别:
<div id="app">
{{ text }}:{{ num }}
<br>
<br>
<out-text @button-click="add"></out-text>
<br>
<out-text2 @button-click="add"></out-text2>
</div>
const app = Vue.createApp({
data() {
return {
text: "外部 num",
num: 0,
}
},
methods: {
add(num) {
this.num = this.num + num;
}
}
});
app.component("outText",{
template: `{{ text }}:<button @click="$emit('buttonClick', num)">emit add</button>`,
data() {
return {
text: "内部元件",
num: 3,
};
},
emits: ['buttonClick']
});
app.component("outText2",{
template: `{{ text }}:<button @click="$emit('buttonClick', '1')">test</button>`,
data() {
return {
text: "emits",
num: 3,
};
},
emits: {
buttonClick: (num) => {
if (typeof num !== 'string') {
console.warn('buttonClick 事件参数型别须为 String')
}
return typeof num === 'string'
}
}
});
app.mount("#app");
观察outText2
里面的$emit
带的参数是一个字串1,而emits
要改为物件,把要观察的事件
带入buttonClick: (num)
,(num)
就是$emit('buttonClick', '1')
的参数,如果参数的型别是字串的话就不会跳出警告,可以试着更改参数型别,警告提示就会显示:[Vue warn]: Invalid event arguments: event validation failed for event 'buttonClick'
,事件验证失败,就可以知道带出去的参数是否符合预期。
以上如有错误,欢迎指教。
>>: 第 20 集:Bootstrap 客制化 Sass variable
目标 今天要做的是,拖拉然後卷动区块 Step1 const slider = document.q...
Child Process tags: IT铁人 Context Switching 前面提到电脑会...
前言: 前一天提到 val_accuracy 的数值约落在0.6500上下 改成只储存数值高的 ac...
这是我们今天要聊的内容,老样的,如果你已经可以轻松看懂,欢迎直接左转去看同事 Kyle 的精彩文章...
Debian/Ubuntu Linux都使用apt,升级时都是: apt-get update ap...