less使用::v-deep或者/deep/ 把样式作用到根标签之外的其他标签上,样式不起作用,用这个或者!important
从一个vue组件给另一个vue组件传值
// 父向子语法: // 子组件定义props来接收父组件传的值 // 数组形式 props:['title','arr'] // 对象形式:可以指定是否必传,传递的数据类型,默认值,自定义校验函数 // 接收的值是数组类型 props: { arr: { type:Array, required:true } } // 父组件通过属性来传递值 例子: :arr='list' /* *父向子传值的本质:在子组件标签上自定义属性,把值传给子组件 子组件通过props接收 注意:传递的数据是什么类型,接收的也是什么类型,想传什么类型的数据就传什么类型的数据 注意2:当接收的属性名是两个单词用"-"连接时,在props里面要用小驼峰命名法 */
单向数据流本质:父组件向子组件传值,子组件改变父组件传入的数据不通知父组件会导致数据的不一致性,并且props里面的值是只读的,不能赋值
分两种情况:
如果修改的是普通数据类型,重新赋值,相当于修改了地址
如果修改的是复杂数据类型,可以修改里面的值,不能修改地址,重新给数组或对象赋值
本质:1.在子组件标签身上,自定义事件
2.在子组件内部($emit)触发,相当于子组件事件后面的函数调用了
目标1:铺设代办任务 1.先把APP.vue里面的list数组传到todomain中 2.v-for循环展示数据 3.v-model绑定复选框选中状态 4.完成的动态样式绑定 任务完成才有这个样式 目标2:添加任务 1.给添加输入框绑定键盘事件--回车按键 2.v-model拿到输入框的值 新增的任务变量 3.子向父传值 list数组在父组件app.vue里面,传递一个新增的任务 4.父组件自定义事件的触发 把新增的任务添加到list数组里 id这里要判断数组长度是否为0的情况 5.清空input框的内容 目标3:删除任务 1.给删除按钮绑定点击事件 2.通知父组件删除任务 this.$emit() 监听父组件的自定义事件 并传递id给父组件 3.父组件触发这个自定义事件 4.父组件接收子组件传递的id和父组件循环的id是否一样来找索引 5.根据索引删除数据 目标4:展示剩余数量值 1.这个数量值来源list数组的长度,父向子传值 2.子组件直接展示也行,计算属性展示也可以 定义计算属性 computed: { count() { return this.list.length } } 目标5:点谁谁亮 1.定义变量isSel 用来存储all,yes,no 2.添加动态类名 3.点击切换isSel的值 4.父向子传值 传递切换数据的类型 目标6:展示对应的数据 1.定义中转变量 2.修改中转变量 3.通过修改的中转变量和list数组筛选显示数据 目标7:把数据存到本地(缓存) 1.侦听器:侦听list数组的变化,深度侦听 2.当数据变化,把数据存入本地,注意本地存储只能存字符串 3.默认从本地取出数据,取出的数据转为JSON格式的字符串,如果没有给个空数组 目标8:清除已完成 1.清除已完成---点击事件 2.子传父 子组件监听清除事件$emit() 3.父组件执行清除事件 4.删除未完成数组覆盖原list数组 目标9:全选影响小选,小选影响全选 计算属性: computed: { // 拿到全选按钮的选中状态 set(checked) { // 把全选按钮的选中状态赋值给小选框 this.list.forEach(item=>item.isDone=checked) }, get() { // 数组长度为0 全选按钮就不选中 this.list.length!==0 && this.list.every(item=>item.isDone===true) } }
// 新建eventBus文件
// 在eventBus中导入vue对象
// 默认导出eventBus
// eventBus.$on('事件名',函数体)语法 执行自定义事件
// eventBus.$emit('事件名',值)监听自定义事件