尚硅谷Vue系列教程学习笔记
Posted Dream_WLB
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷Vue系列教程学习笔记相关的知识,希望对你有一定的参考价值。
尚硅谷Vue系列教程学习笔记(8)
- 参考课程:《尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通》
- 参考链接:https://www.bilibili.com/video/BV1Zy4y1K7SH?vd_source=4f4d3466cdc2c5a2539504632c862ce7
- 笔记上传说明:上述课程中共有168节小课,对每10次课的笔记整合之后上传一次。
- 详细代码案例请移步本人gitee仓库: vue_basic案例代码实现
- Vue-cli脚手架实现案例代码见仓库:vue01
目录
071-TodoList案例-初始化列表
重点:js里面存储数据两种选择:数组/对象;
技巧:对于每个Item来说,使用数组保存多个item,然后对于每个item来说,可以记为一个对象。
绑定动态数据代码实现:
//将数据写入到了页面中,然后在Item组件中使用props属性接收传入的值
<template>
<ul class="todo-main">
<MyItem v-for="todoObj in todos" :key="todoObj.id" :todo="todoObj"/>
</ul>
</template>
<script>
//引入Item组件
import MyItem from "../components/MyItem.vue";
export default
name: "MyList",
components:
MyItem,
,
//装载数据
data()
return
todos:[
id:"0001", name:"吃饭", done:false,
id:"0002", name:"看电影",done:true,
id:"0003", name:"玩游戏",done:true,
]
;
</script>
<style>
/*list样式*/
.todo-main
margin-left: 0px;
border: 1px solid #ddd;
border-radius: 2px;
padding: 0px;
.todo-empty
height: 40px;
line-height: 40px;
border: 1px solid #ddd;
border-radius: 2px;
border-left: 5px;
padding-left: 5px;
margin-top: 10px;
</style>
//在MyItem.vue组件中接受数组中的对象值
<template>
<li>
<label>
<input type="checkbox" :checked="todo.done"/>
<span>todo.name</span>
</label>
<button class="btn btn-danger">删除</button>
</li>
</template>
<script>
export default
name: "MyItem",
//声明接受todo对象
props:['todo']
</script>
<style scoped>
/*item*/
li
list-style: none;
height: 36px;
line-height: 36px;
padding: 0 5px;
border-bottom: 1px solid #ddd;
li label
float: left;
cursor: pointer;
li label li input
vertical-align: middle;
margin-right: 6px;
position: relative;
top: -1px;
li button
float: right;
/* display: none; */
margin-top: 3px;
li:before
content: initial;
li:last-child
border-bottom: none;
</style>
072-TodoList案例-添加数据
技巧:一个组件给父组件传数据的方法,父组件需要首先给该组件传入一个函数,该组件调用该函数,并向其中传入数据作为参数即可。
实现:MyHeader.vue组件向App.vue组件中传入数据以及用户在输入框输入数据之后,添加到list中案例代码:
//MyHeader.vue组件代码
<template>
<div class="todo-header">
<input
type="text"
placeholder="请输入你的任务名称,按回车键确认"
@keyup.enter="addWork"
/>
</div>
</template>
<script>
import nanoid from "nanoid";
export default
name: "MyHeader",
methods:
addWork(event)
if (!event.target.value.trim())
return alert("注意:输入不能为空!");
//(event)
//将用户输入数据包装成一个对象
const todoObj =
id: nanoid(),
name: event.target.value,
done: false,
;
//调用接收到的receiveData()方法
this.receiveData(todoObj);
//添加之后将输入框中的数据清空
event.target.value = "";
,
,
props: ["receiveData"],
;
</script>
<style scoped>...</style>
//App.vue组件代码
<template>
<div id="root">
<div class="todo-container">
<div class="todo-wrap">
<MyHeader :receiveData="receiveData"/>
<MyList :todos="todos"/>
<MyFooter />
</div>
</div>
</div>
</template>
<script>
//引入组件
import MyHeader from "./components/MyHeader.vue";
import MyFooter from "./components/MyFooter.vue";
import MyList from "./components/MyList.vue";
export default
name: "App",
components:
MyHeader,
MyFooter,
MyList,
,
//装载数据
data()
return
todos: [
id: "0001", name: "吃饭", done: false ,
id: "0002", name: "看电影", done: true ,
id: "0003", name: "玩游戏", done: true ,
],
;
,
methods:
receiveData(todoObj)
// console.log("我收到了Header中的数据:",todoObj)
this.todos.unshift(todoObj)
;
</script>
<style>...</style>
技巧:数据在哪里,操作数据的方法就在哪里。
073-TodoList案例-勾选动作实现
勾选实现代码:
//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参数即可。
074-TodoList案例-删除动作
删除任务案例代码:
//在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即可。
075-TodoList案例-底部统计功能实现
重点:在统计数组中的已经做完的任务数量时,使用两种方法均可:
//第一种写法,使用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
076-TodoList案例-底部交互动作实现
底部全选/全不勾选的逻辑实现和清除所有已完成任务动作的代码:
//在App.vue组件中设置如下函数
//全选或取消全选
checkAllWork(done)
this.todos.forEach((todo)=>
todo.done = done
)
,
//删除所有已完成任务
clearAll()
this.todos = this.todos.filter((todo)=>
return todo.done === false
)
//然后传到MyFooter.vue组件中并进行调用即可
077-TodoList案例-总结
注意:v-model是不能绑定props属性传来的值的,因为props属性的值是固定不变的。
具体重点总结见上述总结内容。
078-浏览器本地存储
重点:
1.使用localStorage对象存储数据时,key和value一定都是字符串对象;
2.只要value不是string类型的,它会主动将value的值转换为string,因此如果你传入的value为一个对象,那么转为string类型之后为[Object Object],那么需要使用的是JSON.stringfy()函数即可。
3.sessionStorage对象和localStorage对象中的方法一致,两者不同的是:只要浏览器关闭,那么sessionStorage就会被全部清除掉;
079-TodoList-本地存储
本地存储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')) : []
;
,
080-组件自定义事件-绑定
重点:自定义事件是给组件使用的。
通过自定义事件将组件的数据传给其父组件:
//Student.vue组件中的代码
<template>
<div>
<h2>学生姓名: name </h2>
<h2>学生年龄: age </h2>
<button @click="sendStudentNameToApp">点击将学生姓名传给App.vue组件</button>
</div>
</template>
<script>
export default
// eslint-disable-next-line vue/multi-word-component-names
name: "Student",
data()
return
name: "wyy",
age: 22,
,
methods:
sendStudentNameToApp()
console.log("sendStudentDataToApp被调用了...")
this.$emit("addData",this.name)//调用App.vue组件中定义的函数
;
</script>
<style>
</style>
//App.vue组件中的代码
<template>
<h2> msg </h2>
<School />
<Student v-on:addData="demo"/>
</template>
<script>
import School from "./components/School.vue";
import Student from "./components/Student.vue";
export default
name: "App",
components:
School,
Student,
,
data()
return
msg: "你好啊!",
;
,
methods:
demo(name)
console.log("App得到的学生姓名为:",name)
;
</script>
<style>
</style>
同时,实现上述功能还有另外一种写法:
//在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止
以上是关于尚硅谷Vue系列教程学习笔记的主要内容,如果未能解决你的问题,请参考以下文章