因为你少了一步,应该在数据提交之后,将inputValue置空
我试了试好像不行
放在和其他实例并列的地方吧
父组件到子组件数据传递:
父组件通过绑定自定义属性(如:content="item")向子组件传参,子组件需要使用props接收父组件所传递的参数(如 props:['content'],)
子组件调父组件方法:
子组件通过$emit(funcName,value)的方式(如:$emit( 'delete', this.index))触发父组件的监听方法(如:@delete="handleDelete"),父组件收到监听后,会用模板中定义的handleDelete方法
父组件通过绑定自定义属性(如:content="item")向子组件传参,子组件需要使用props接收父组件所传递的参数(如 props:['content'],)
自问自答,因为上节课没有跟着做,li上面没有绑定click事件
视频说的清楚,要实现删除,需要把list里的相关内容删除。而list是父组件data里的一个元素,只能在父组件里删才能删除。至于父组件传给子组件的事LIST添加的内容,子组件反传回来的是当前点击了哪一个(要删除哪一个LI)的INDEX.
js 里的方法,想进一步了解直接百度js splice
不传第二个参数会默认删掉下标为0的数据,你试试
比如老师例子的那个要传递参数的问题,如果需要传递参数的话,写成this.$emit('delete',index),如果不需要传值,直接就this.$emit('delete')即可
index代表数组list的下标
如果list是对象,KEY必然可以的,但list是数组,就不行了。这里的key是按添加顺序的,比如分别添加A,B,C,D,E,在未删除过时,Index与KEY可以一致,都是0,1,2,3,4,但经过几次删除添加后,Index与KEY就不一定对应了,比如删除C后,index变成0,1,2,3,但KEY可能就是0,1,3,4了。记住一点,KEY的作用是避免重复,不具序号功能,无法准确定位。
<todo-item>中应该是@delete而不是click
template中的li没有增加点击事件@click="handleClick"
增加以上两个,点击后会弹出对应的内容
如果需要删除:
handleDelete: function (index) {
this.list.splice(index,1)
}
key的定义来源于键值对,一般是存在于对象里。数组有index,和值。key具有唯一性,这里的KEY由系统自动生成,类似数据库表里的主键,目的是避免重复显示,所以传递key出来,与数组的index相比,肯定是index更符合数组的使用需求
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>todo</title> <script type="text/javascript" src="./vue.js"></script></head><body> <div id="app"> <input type="text" v-model="event"> <button @click="submit">提交</button> <!-- 不使用组件 --> <ul> <li v-for="(item, index) in list" :key="index" :data-id="index" @click="del">{{item}}</li> </ul> <!-- 使用全局组件 --> <!-- <ul> <todo-item-qj v-for="(item, index) in list" :key="index" :content="item" :prex="index" @delete="handleDelete" > </todo-item-qj> </ul> --> </div> <script type="text/javascript"> // 全局组件 Vue.component('todo-item-qj', { props: ['content', 'prex'], template: '<li @click="handleClick">{{prex}} - {{content}}</li>', methods: { handleClick: function(){ this.$emit('delete', this.prex); } } }); // 局部组件 var todoItem = { props: ['content', 'prex'], template: '<li>{{prex}} - {{content}}</li>', }; var app = new Vue({ el: '#app', data: { event: '', list: [], }, methods:{ submit: function(){ if(!this.event.length) { alert('输入值'); } this.list.push(this.event); this.event = ''; }, del: function(event){ // console.log(event.target.dataset.id); let prex = event.target.dataset.id; this.list.splice(prex, 1); }, handleDelete: function(prex) { // alert(prex); this.list.splice(prex, 1); }, } }); </script></body></html>
for循环出N个的li元素,每个li元素里面都有click事件、key、content、index以及delete,在点击某个li元素的时候,对触发的那个方法(click)来说,this就代表了触发的那个li元素,this里面就有前面说的key、content、index。
点击事件在子组件上面,只有子组件知道点击的是哪一个index
你的method方法,掉了参数index,应该为
handleDelete:function(index){
this.list.splice(index,1)
}
<input type="button" value="删除" @click="deleteaaa(index)">
deleteaaa: function (index) { // delete 避免将javascript一元运算符用作属性名 this.users.splice(index,1); }
不要直接用"delete" 随便换个其他的名字
因为那里是接收的参数
1表示删除的数量,这里的splice方法是从index的位置开始,删除1个item
不行。父子组件之间数据是单向下行绑定的,反过来不行。具体看手册“单向数据流”
this.list.splice(index,1)
意思时删除数组元素list[index]开始的连续一个元素,其实就是list[index]。
显示是跟父组件的list数组绑定的,你不删除List的内容,没用
试过,拿不到
[Vue warn]: "key" is a reserved attribute and cannot be used as component prop.
found in
---> <TodoItem> at src/components/TodoItem.vue
<TodoList> at src/TodoList.vue
<Root>
自问自答系列,居然是因为父组件的绑定事件没有传参
<todo-item>其实是一个无法识别的标签,可以理解为自定义标签,但你没有定义它