重点:js里面存储数据两种选择:数组/对象;
技巧:对于每个Item来说,使用数组保存多个item,然后对于每个item来说,可以记为一个对象。
绑定动态数据代码实现:
//将数据写入到了页面中,然后在Item组件中使用props属性接收传入的值
//在MyItem.vue组件中接受数组中的对象值
-
技巧:一个组件给父组件传数据的方法,父组件需要首先给该组件传入一个函数,该组件调用该函数,并向其中传入数据作为参数即可。
实现:MyHeader.vue组件向App.vue组件中传入数据以及用户在输入框输入数据之后,添加到list中案例代码:
//MyHeader.vue组件代码
//App.vue组件代码
技巧:数据在哪里,操作数据的方法就在哪里。
勾选实现代码:
//App.vue代码
//在methods中添加一个函数,实现由id得到数据,进而修改数据中的done值为其相反值
methods:{
...,
//修改对应id下标的数据的done值为相反值
checkTodo(id){
console.log("App.vue : ",id)
this.todos.forEach((todo) => {
if(todo.id === id){
// console.log("find that")
todo.done = !todo.done //将对应的值取反
}
})
}
}
//然后在App.vue中的MyList组件传入上述函数,在MyList.vue组件中接受上述函数之后,继续传给MyItem.vue组件,然后在MyItem.vue组件中的监听勾选与否的函数中使用上述函数,并向其中传入id参数即可。
删除任务案例代码:
//在App.vue组件中的methods属性中添加如下方法
//删除选定的任务
deleteTodo(id){
console.log("Delete todo...")
this.todos = this.todos.filter((todo)=>{
return todo.id !== id
})
}
//然后通过MyList.vue传到MyItem.vue组件中,然后在MyItem.vue组件中调用上述方法,传入参数id即可。
重点:在统计数组中的已经做完的任务数量时,使用两种方法均可:
//第一种写法,使用for循环遍历
doneSize() {
let sum = 0;
for (let i = 0; i < this.todos.length; i++) {
if (this.todos[i].done === true) {
sum++;
}
}
return sum;
},
//第二种方法:使用reduce函数
doneSize(){
sum = this.todos.reduce((pre, current)=>{
return pre + (current.done === true ? 1 : 0)
},0)
return sum
}
底部全选/全不勾选的逻辑实现和清除所有已完成任务动作的代码:
//在App.vue组件中设置如下函数
//全选或取消全选
checkAllWork(done){
this.todos.forEach((todo)=>{
todo.done = done
})
},
//删除所有已完成任务
clearAll(){
this.todos = this.todos.filter((todo)=>{
return todo.done === false
})
}
//然后传到MyFooter.vue组件中并进行调用即可
注意:v-model是不能绑定props属性传来的值的,因为props属性的值是固定不变的。
具体重点总结见上述总结内容。
重点:
1.使用localStorage对象存储数据时,key和value一定都是字符串对象;
2.只要value不是string类型的,它会主动将value的值转换为string,因此如果你传入的value为一个对象,那么转为string类型之后为[Object Object],那么需要使用的是JSON.stringfy()函数即可。
3.sessionStorage对象和localStorage对象中的方法一致,两者不同的是:只要浏览器关闭,那么sessionStorage就会被全部清除掉;
本地存储TodoList的实现代码:
//给todos数组设置一个监视属性
watch: {
//完整watch监视属性写法
todos: {
handler(value) {
localStorage.setItem("todos", JSON.stringify(value));
//console.log("保存todoList变量到localStorage对象成功...");
},
immediate: true,
deep: true,
}
},
//在设置初始化todos数组的值时有一个细节需要注意:就是如果localStorage.getItem('todos')的值为null时,Vue会出现错误,因此需要进行一个简单的判断如下:
//装载数据
data() {
return {
todos: localStorage.getItem('todos') !== null ? JSON.parse(localStorage.getItem('todos')) : []
};
},
重点:自定义事件是给组件使用的。
通过自定义事件将组件的数据传给其父组件:
//Student.vue组件中的代码
学生姓名:{{ name }}
学生年龄:{{ age }}
//App.vue组件中的代码
{{ msg }}
同时,实现上述功能还有另外一种写法:
//在App.vue组件对象中的mounted()方法
methods: {
// demo(name){
// console.log("App得到的学生姓名为:",name)
// }
getStudentName(name) {
console.log("得到学生姓名为:", name);
},
},
mounted() {
//得到了Student组件的实例对象
this.$refs.student.$on("addData", this.getStudentName);
},
这种方法相当于直接获得Student.vue组件的对象,然后设置on函数并向其中传入methods中的方法
//截止到2022.8.24下午18:08止