vuecli-使用自定义组件实现TodoList
vuecli-使用自定义组件实现TodoList
实现todolist官网效果
准备2个子组件:Input.vue,List.vue;准备1个父组件:App.vue
Input.vue--- 用户在input文本框中输入内容,有的时候,输入完内容敲回车,希望内容保留;有的时候,输入完内容敲回车,希望内容清空。
这里自定义一个属性clear,给其默认值为false--就是不清空,去控制这个文本。
<template> <input type="text" v-model="value" @keypress.enter="handleEnter"> </template> <script> export default { // 自定义属性 props:{ clear:{ type:Boolean, default:false } }, data() { return { value:'' }; }, methods: { handleEnter(){ console.log(this.value) // 自定义事件enter,并且将 一个值 传过去 this.$emit('enter',this.value); // 如果自定属性clear的值是真的话 if(this.clear){ // 将input文本框中的值--清空! this.value = '' } } }, }; </script> <style scoped> </style>
App.vue---父组件 引入2个子组件 使用
<template> <div> <my-input></my-input> <my-list></my-list> <my-list></my-list> </div> </template> <script> import Input from '@/views/Input.vue' import List from '@/views/List.vue' export default { data() { return { }; }, methods: { }, components:{ 'my-input':Input, 'my-list':List } }; </script> <style scoped> </style>
如果 有的时候,输入完内容敲回车,希望内容清空。
你在这里修改:
clear的默认值为true,即可。
页面预览效果,如下所示:
到这里,我们设计的 Input.vue组件,就设计好了。
接着看App.vue-和 List.vue--- title 传不同的值过来,显示不同的内容!
接着看App.vue-和 List.vue---用户在Input文本框,输入的值,存储到App.vue数据中心data中的list数组中,然后将这个数组 传递给 List.vue子组件的 自定义属性data
去使用!!
在input文本框中,输入数据,数据存储到App.vue的数据中心data中的list,list中的数据,传递给子组件List.vue中自定义属性data里,预览效果如下所示:
再接着看List.vue 和App.vue--- 删除list.vue 组件 无序列表上的内容,点击“删除”按钮,执行删除操作。
注意:
del(item,index){ // 注意:这里2个索引容易搞混淆!! // 我们不需要用index这个索引 //console.log(index) // 我们当前需要的是,拿到 当前这项内容,所在 位置的索引 let i = this.list.indexOf(item); // 然后将 这个位置上的内容 删除掉 this.list.splice(i,1) }
对比:
获取index的索引,结果如下所示:
再接着看List.vue----List.vue中自定义属性data中的数据,如果你 需要对data 通过一些计算得到 一些你需要的 筛选的数据。
这里的重点是:done的使用!!(通过这个属性,去控制 到底 是已完成,还是未完成的!)
在list.vue组件中,自定义属性done
List.vue自己的视图层使用done这个自定义属性:
预览效果如下所示:
注意:
也可以这样写:(因为它是布尔类型,可以直接done这样写上 就ok了,如下所示:)
List.vue自己的逻辑层使用done这个自定义属性:
done怎么控制 视图层li的显示?---data的数据
<li v-for="(item,index) in data" :key="index"> <input type="checkbox" :checked="done"> <span> {{item.title}} </span> <button @click="handleDel(item,index)">删除</button> </li>
怎么表示 已完成的?
怎么表示 未完成的?
----data的数据 是通过一系列的运算得到的,你可以通过计算属性得到它。
你可以在计算属性computed中设置,如下所示,
computed:{
showList(){
return this.data.filter()
}
}
computed:{ showList(){ // filter把符合条件的“过滤出来”,放在一个新数组里面 return this.data.filter((item)=>{ // 如果 自定义属性中的done的值,正好 // 和 当前遍历的过程中 的item.done 这一项的值 相等 // 我们将 这样的数据项 拿到,为我们 所用!!! // 我们要过滤 item.done 等于 当前传进来的done return item.done = this.done }) } },
预览效果,如下所示:
接着,
list.vue组件上,添加 复选框
<input type="checkbox" :checked="done">
在App.vue中视图层上的 ,my-list.vue组件上添加 点击事件
<my-list title="正在进行" :data="list" @change="success" @remove="del"></my-list>
所有的业务逻辑,全部由 使用者来完成,这里的使用者是---App.vue
在List.vue组件中,添加复选框,
点击后,“发生什么”,“干什么”,我(List.vue)是不管的!!
在App.vue中视图层上的 ,这个标签(my-list.vue组件上)添加 点击事件
<my-list title="正在进行" :data="list" @change="success" @remove="del"></my-list>
这个change事件,是我们在底层什么的,至于它要干什么?我们在使用的标签的时候,才申明~~@change="success",success它要改变done的状态。
预览,效果如下所示:
接着,我们点击 每一个列表项,我们要实现完成修改的操作。
设置span标签为行内块元素,在span标签下,添加input标签,如下所示:
<span class="list-item"> {{item.title}} </span> <input type="text" v-model="item.title" class="update-input">
css样式:
<style scoped> ul{ list-style: none; } li{ margin: 20px 0; } .list-item{ display: inline-block; width: 200px; height: 30px; } .update-input{ width: 200px; height: 30px; } </style>
预览效果如下所示:
还没有留言,还不快点抢沙发?