vue自定義事件傳參要一一對應
TodoList.vue :
<template>
<ul>
<li>
<todo-item
v-for="item in list" :key="item.id"
:status="doneList.includes(item.id)"
:info="item"
@click="changeStatus0"
></todo-item>
</li>
<li>
<todo-item
v-for="item in list" :key="item.id"
:status="doneList.includes(item.id)"
:info="item"
@click="changeStatus1()"
></todo-item>
</li>
<li>
<todo-item
v-for="item in list" :key="item.id"
:status="doneList.includes(item.id)"
:info="item"
@click="changeStatus2(item)"
></todo-item>
</li>
<li>
<todo-item
v-for="item in list" :key="item.id"
:status="doneList.includes(item.id)"
:info="item"
@click="changeStatus3(arguments, item)"
></todo-item>
</li>
</ul>
</template>
<script>
import TodoItem from './TodoItem'
export default {
name: 'TodoList',
components: {
TodoItem
},
data () {
return {
list: [
{
id: 0,
name: 'zero',
desc: 'zerozerozero'
},
{
id: 1,
name: 'one',
desc: 'oneoneone'
},
{
id: 2,
name: 'two',
desc: 'twotwotwo'
}
],
doneList: [1]
}
},
methods: {
changeStatus0 (val, obj) {
console.log(val)
console.log(obj)
},
changeStatus1 (val) {
console.log(val)
},
changeStatus2 (obj) {
console.log(obj)
},
changeStatus3 (arr, obj) {
console.log(arr)
const val = arr[0]
if (val) {
const index = this.doneList.indexOf(obj.id)
this.doneList.splice(index, 1)
} else {
this.doneList.push(obj.id)
}
}
}
}
</script>
TodoItem.vue :
<template>
<label @click="changeStatus">
<span>{{ info.name }}: {{ status }}</span>
</label>
</template>
<script>
export default {
name: 'TodoItem',
props: {
status: {
type: Boolean,
default: false
},
info: {
type: Object,
default () {
return {}
}
}
},
methods: {
changeStatus () {
this.$emit('click', this.status, this.info)
}
}
}
</script>
changeStatus0打印的是TodoItem.vue中$emit后跟的兩個參數。changeStatus1打印的是undefined。changeStatus2打印的是v-for循環中的當前item對象。changeStatus3中arr參數對應$emit后跟的兩個參數,item參數對應v-for循環中的當前item對象,注意 template 中的寫法@click="changeStatus3(arguments, item)",按照changeStatus3的方式可以實現多種方式的混合傳參。
一、在原生dom事件里就是事件對象
注意兩點
1.不使用圓括號,event被自動當作實參傳入
2.使用圓括號,必須顯式的傳入event對象,如果不傳入可能最終找到的是全局的window .event
二、自定義事件組件,就是$ emit 的第一個參數
vue中事件綁定v-on,簡寫可以寫作@
