JSX实现todoList案例
在vue2中使用JSX实现todoList案例,通过这个案例,可以了解template的v-if、v-for、v-on、v-model、为组件添加样式、传递自定义事件及数据,在JSX中如何实现。
注意:JSX是在render函数写的,由于使用了render函数,template就不用写了,因为template和render同时存在,会以template为准。
拆分组件
Header:添加todo
List:展示全部数据的区域
Item:展示每条todo信息、修改和删除操作
Footer:统计已完成的todo、清除已完成
目录结构如下:
1 | ├─ src |
页面效果如下:
数据存储
将数据放在App.vue下
因为header为增加数据,List也要获取数据,对数据进行删改查操作,Footer也要用数据进行统计、删除,App作为它们的父组件,父子通信比非父子通信更简单、快捷
完成添加todo
涉及两个组件App和Header
在Header组件中添加todo,将todo数据整理好,携带数据并通知App(父组件)添加数据,进行父子通信,用到自定义事件。
JSX:
自定义事件在JSX中的写法是这样的:vOn:getToDo={this.getToDo},vOn表示v-on,getToDo表示自定义事件名,在
{}
里写JS代码v-model需要写成:vModel={this.task},驼峰式写法
绑定的事件需要添加修饰符如keyup.enter,需要写成vOn:keyup_enter={this.submit}
App.vue组件代码如下:
1 | import Header from "@/components/Header.vue"; |
Header.vue代码
1 | export default { |
完成todoList展示、选中、修改、删除
涉及三个组件:App、List、Item
其中删除、修改在Item组件中,需要到App组件去操作数据,而Item和App是爷孙关系,可以使用**$attr和$listeners**进行爷孙通信,v-on=”$listeners”可以让子组件继承所有我们依赖的组件的事件。
在点击修改按钮,显示输入框时,单纯使用v-show或v-if并不能使显示的输入框自动聚焦,所以我使用自定义指令和v-if组合实现显示输入框自动聚焦。
之所以不使用自定义+v-show,是因为使用自定义完成input框聚焦时,使用的inserted钩子只在节点插入时生效,v-show的效果相当于display为none或block,并不像v-if那样实现对节点的增删。
JSX:
- 在JSX中组件需要传递多个事件,可以使用
on={{事件1,事件2...}}
- 父组件传递数据给子组件:todoList={this.todoList}
- v-on=”$listeners”,需要写成:on={this.$listeners}
- v-show和自定义指令v-focus,需要写成驼峰式写法:vShow、vFocus
- 添加多个样式:class={[cls,’btn’]},其中cls为变量传入,并且可以写JS表达式(如三元运算符)
App(爷)组件代码
1 | import Header from "@/components/Header.vue"; |
List(父)组件代码
1 | import Item from "@/components/Item.vue"; |
Item(孙)组件代码
1 | export default { |
统计todoList和清除已完成的todo
涉及两个组件:App和Footer组件
footer在清除已完成的todo和全选或取消全选时,需要通知App去修改数据,父子通信使用自定义事件
App组件代码
1 | import Header from "@/components/Header.vue"; |
Footer组件代码
1 | export default { |