尚硅谷Vue系列教程学习笔记
Posted wyypersist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷Vue系列教程学习笔记相关的知识,希望对你有一定的参考价值。
尚硅谷Vue系列教程学习笔记(4)
- 参考课程:《尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通》
- 参考链接:https://www.bilibili.com/video/BV1Zy4y1K7SH?vd_source=4f4d3466cdc2c5a2539504632c862ce7
- 笔记上传说明:上述课程中共有168节小课,对每10次课的笔记整合之后上传一次。
- 详细代码案例请移步本人gitee仓库: vue_basic案例代码实现
目录
031-列表过滤
实现对列表内容搜索的方法步骤:
1.收集用户的输入内容;
2.将收集到的内容应用到列表中;
案例—名字过滤:
//使用监视属性实现
<div id="root">
<!--遍历数组-->
<ul>
<!--让每一个li都有一个id标识-->
<h2>遍历列表</h2>
<input type="text" placeholder="请输入想要搜索的名字:" v-model="keyWords">
<li v-for="p in filPersons" :key="p.id">
p.name-p.id-p.age
</li>
</ul>
</div>
//js代码如下:
new Vue(
el: "#root",
data:
keyWords:"",
persons: [
id: '001', name: '张三', age: 22 ,
id: '002', name: '李四', age: 24 ,
id: '003', name: '王五', age: 26 ,
id: '004', name: '一哥', age: 26
],
filPersons:[]
,
//用watch计算属性实现
watch:
keyWords:
immediate:true,
handler(val)
// console.log(val)
this.filPersons = this.persons.filter((p) =>
return p.name.indexOf(val) !== -1
)
)
2.使用计算属性实现
<div id="root">
<!--遍历数组-->
<ul>
<!--让每一个li都有一个id标识-->
<h2>遍历列表</h2>
<input type="text" placeholder="请输入想要搜索的名字:" v-model="keyWords">
<li v-for="p in filPersons" :key="p.id">
p.name-p.id-p.age
</li>
</ul>
</div>
//js代码:
new Vue(
el: "#root",
data:
keyWords:"",
persons: [
id: '001', name: '张三', age: 22 ,
id: '002', name: '李四', age: 24 ,
id: '003', name: '王五', age: 26 ,
id: '004', name: '一哥', age: 26
]
,
//使用computed计算属性
computed:
filPersons(val)
return this.persons.filter((p)=>
return p.name.indexOf(this.keyWords) !== -1
)
)
032-列表排序
使用计算属性实现列表排序的案例:
<div id="root">
<!--遍历数组-->
<ul>
<!--让每一个li都有一个id标识-->
<h2>遍历列表</h2>
<input type="text" placeholder="请输入想要搜索的名字:" v-model="keyWords">
<button @click="sortType = 1">年龄升序</button>
<button @click="sortType = 2">年龄降序</button>
<button @click="sortType = 0">原顺序</button>
<li v-for="p in filPersons" :key="p.id">
p.name-p.id-p.age
</li>
</ul>
</div>
//js代码
new Vue(
el: "#root",
data:
keyWords:"",
sortType:0, //0代表原顺序,1代表升序,2代表降序
persons: [
id: '001', name: '张三', age: 22 ,
id: '002', name: '李四', age: 24 ,
id: '003', name: '王五', age: 26 ,
id: '004', name: '一哥', age: 26
]
,
//使用computed计算属性
computed:
filPersons(val)
//保留filPersons过滤后的数组
const arr = this.persons.filter((p)=>
return p.name.indexOf(this.keyWords) !== -1
)
//然后进行排序
if(this.sortType !== 0)//表示需要排序
arr.sort((a,b)=>
return this.sortType === 1 ? b.age- a.age : a.age - b.age
)
return arr
)
033-更新时的一个问题
更新时面对的问题:
<div id="root">
<!--遍历数组-->
<ul>
<!--让每一个li都有一个id标识-->
<h2>遍历列表</h2>
<button @click="updateSan">点击更新张三的信息</button>
<li v-for="p in persons" :key="p.id">
p.name-p.id-p.age
</li>
</ul>
</div>
//js代码如下:
<script type="text/javascript">
Vue.config.productionTip = false
//得到vm对象实例
const vm = new Vue(
el: "#root",
data:
persons: [
id: '001', name: '张三', age: 22 ,
id: '002', name: '李四', age: 24 ,
id: '003', name: '王五', age: 26 ,
id: '004', name: '一哥', age: 26
]
,
methods:
updateSan()
this.persons[0] = id:"000",name:"马老师",age:"54"
console.log("已经更新完毕!")
)
</script>
上述代码中虽然点击按钮之后,在浏览器的控制台中调用vm.persons[0].name属性可以发现persons数组中的第一个项已经更改,但是Vue模板并没有监测到,这就是以这种方式进行更新时的一个问题。
具体原因解释详见034-Vue更新数据原理一节笔记。
034-Vue监测数据的原理_对象
Vue实现监测数据原理,下面为较简单的Vue监测数据代码:
<body>
<!--准备好一个容器-->
<div id="root">
</div>
<script type="text/javascript">
let data =
name:"test",
address:"测试地址"
//创建一个监视的实例对象,用于监视数据的变化
const obs = new Observer(data)
//准备一个vm实例对象
let vm =
vm._data = data = obs
function Observer(obj)
//汇总对象中所有的属性形成一个数组
const keys = Object.keys(obj)
//遍历
keys.forEach((k)=>
Object.defineProperty(this, k,
get()
return obj[k]
,
set(val)
console.log(`数据被修改了,vm需要重新生成新的虚拟DOM对象...`)
obj[k] = val
)
)
</script>
</body>
上述代码中,只要是存在data中的数据,Vue都会解析到最后不是对象为止,然后分别为每个对象生成一个get和set方法,然后在用户修改vm中数据对象时,set方法会被调用,然后set方法中还有更新真实DOM的逻辑,进而Vue实现更改data中数据对象之后,前端真实DOM中也会发生改变的功能。
035-Vue.set()方法
重点:Vue中对undefined的属性值不显示。
对于在创建vm实例对象时没有设置的属性,在控制台中使用vm._data.sex = xxx之后,尽管在vm中存在新设置的sex属性,但是没有给sex属性创建get和set方法,因此Vue模板无法解析新创建的sex属性。
Vue不允许添加一个属性在vm实例身上,即下面的代码是不被Vue允许的:
Vue.set(vm._data,"sex","男")
使用Vue.set()方法实现点击之后给数据对象添加一个性别代码示例:
<div id="root">
<h2>学校名称:name</h2>
<h2>学校地址:address</h2>
<h2>校长是:leader</h2>
</br>
<button @click="addAttribute">点我增加性别属性</button>
<h2>学生姓名:student.name</h2>
<h2>学生年龄:真实student.age.rAge, 对外:student.age.sAge</h2>
<h2>学生性别:student.sex</h2>
<ul v-for="f in student.friends" :key="f.id">
<li>f.name-f.age</li>
</ul>
</div>
//js代码:
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue(
el: "#root",
data:
name: "姓名测试",
address: "地址测试",
student:
id: "001",
name: "wyy",
age:
rAge: 18,
sAge: 22
,
friends: [
id: "002", name: "test1", age: 22 ,
id: "003", name: "test2", age: 32 ,
id: "004", name: "test3", age: 25 ,
]
,
methods:
addAttribute()
vm.$set(this.student,'sex','男')
)
</script>
036-Vue监测数据的原理_数组
重点:Vue中不会对数组中的某个元素匹配get和set元素
Vue中更新数组数据的方法:
<div id="root">
<!--遍历数组-->
<ul>
<!--让每一个li都有一个id标识-->
<h2>遍历列表</h2>
<button @click="updateSan">点击更新张三的信息</button>
<li v-for="p in persons" :key="p.id">
p.name-p.id-p.age
</li>
</ul>
</div>
//js代码
<script type="text/javascript">
Vue.config.productionTip = false
//得到vm对象实例
const vm = new Vue(
el: "#root",
data:
persons: [
id: '001', name: '张三', age: 22 ,
id: '002', name: '李四', age: 24 ,
id: '003', name: '王五', age: 26 ,
id: '004', name: '一哥', age: 26
]
,
methods:
updateSan()
//this.persons[0] = id:"000",name:"马老师",age:"54"
// console.log("已经更新完毕!")
this.persons.splice(0, 1, id: "000", name: "马老师", age: "54" )
)
</script>
//即使用vm对象为数组数据提供的splice()方法即可
重点:vm._data.arr.push === Array.prototype.push,结果为false,因为此时vm对象中调用的push方法是Vue提供的一个新的push方法。
总结:Vue对数组的监测实际上是对数组身上常用的数组方法进行包装之后,进行监视的。
037-总结Vue监视数据方法
总结上述Vue监视数据的方法案例代码:
<body>
<!--准备好一个容器-->
<div id="root">
<h1>学生信息</h1>
<h2>操作</h2>
<button @click="student.age++">年龄增加+1岁</button>
<button @click="addSex">添加性别属性,默认值:男</button>
<button @click="changeSex">修改性别属性到与当前相反的值</button>
<button @click="addFriend">在列表首位添加一个朋友</button>
<button @click="changeFirstFriendName">修改第一个朋友的名字为:张三</button>
<button @click="addHobby">添加一个爱好</button>
<button @click="changeFirstHobby">修改第一个爱好为:开车</button>
<h2>姓名:student.name</h2>
<h2>年龄:student.age</h2>
<h2>性别:student.sex</h2>
<h2>该学生的爱好(多个)</h2>
<ul v-for="h in student.hobby" :key="index">
<li>h</li>
</ul>
<h2>该学生的朋友(多个)</h2>
<ul v-for="f in student.friends" :key="f.id">
<li>f.name-f.age</li>
</ul>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue(
el: "#root",
data:
sexType:false,//false表示女,true表示男
student:
name: "wyy",
age: 18,
hobby:["抽烟","喝酒","烫头"],
friends: [
name: "test1", age: 22 ,
name: "test2", age: 33 ,
]
,
methods:
addSex()
Vue.set(this.student, "sex", "男")
,
changeSex()
if(this.sexType === false)
this.sexType = true
this.student.sex = "男"
else if(this.sexType === true)
this.sexType = false
this.student.sex = "女"
,
addFriend()
this.student.friends.unshift(name:"test3",age:26)
,
changeFirstFriendName()
this.student.friends[0].name = "张三"
,
addHobby()
this.student.hobby.push("学习")
,
changeFirstHobby()
// this.student.hobby[0] = "开车"
// this.student.hobby.splice(0, 1, "开车")
// this.$set(this.student.hobby,0,"开车")
Vue.set(this.student.hobby, 0, "开车")
)
</script>
</body>
文字总结:
1.Vue会监视data中所有层次的数据;
2.如何监视对象中的数据:
通过setter实现监视,且要在new Vue时就传入要监测的数据;
(1)对象中后追加的属性,Vue默认不做响应式处理;
(2)如需给后添加的属性做响应式处理,使用如下代码:
Vue.set(target,propertyName/index,value)
vm.$set(target,propertyName/index,value)
3.如何监测数组中的数据:
通过包裹数组更新元素的方法实现,本质就是做了两件事:
(1)调用原生对应的方法对数组进行更新;
(2)重新解析模板,进而更新页面;
4.在Vue中修改数组中间的某个元素一定要用如下方法:
(1)使用API:push()/pop()/shift()/unshift()/splice()/sort()/reverse()
(2)Vue.set()/vm.$set()
重点注意:Vue.set()/vm.$set() 不能给vm或vm的根数据对象 添加属性!!!
038-收集表单数据
重点:Vue中对于checkbox类型的勾选框,在勾选时,需要给每个checkbox框设置value值,然后设置v-model绑定的属性为[]数组类型即可,代码如下所示。
爱好:
学习<input type="checkbox" v-model="hobby" value="study">
看电影<input type="checkbox" v-model="hobby" value="movie">
听音乐<input type="checkbox" v-model="hobby" value="music">
//js代码
<script type="text/javascript">
Vue.config.productionTip = false
new Vue(
el:"#root",
data:
account:"",
password:"",
sex:"",
hobby:[],//设置为数组形式即可
)
</script>
重点:使用v-model.lazy可以实现当输入框失去焦点时,才收集输入框中用户输入的内容。
使用Vue表单提交内容案例代码:
<body>
<!--准备好一个容器-->
<div id="root">
<form @submit.prevent="demo">
账号:<input id="demo" type="text" placeholder="请输入账号:" v-model.trim="account">
</br>
密码:<input type="password" v-model="password">
</br>
性别:
男:<input type="radio" name="sex" value="male" v-model="sex">
女:<input type="radio" name="sex" value="female" v-model="sex">
</br>
年龄:
<input type="number" name="age" v-model.number="age">
</br>
爱好:
学习<input type="checkbox" v-model="hobby" value="study">
看电影<input type="checkbox" v-model="hobby" value="movie">
听音乐<input type="checkbox" v-model="hobby" value="music">
</br>
所属校区:
<select v-model="city">
<option value="">请选择校区:</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shenzhen">深圳</option>
<option value="wuhan">武汉</option>
</select>
</br>
其他信息:
<textarea v-model.lazy="other">
</textarea></br>
<input type="checkbox" v-model="agree">阅读并同意遵守<a href="www.baidu.com">《用户协议》</a></br>
<button>点击提交</button>
</form>
</div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue(
el:"#root",
data:
account:"",
password:"",
sex:"",
hobby:[],
city:"",
other:"",
agree:"",
age:18,
,
methods:
demo()
// console.log(JSON.stringify(this._data))
)
</script>
</body>
039-过滤器
重点:多个组件之间的过滤器配置不能够共享。
Vue中配置全局过滤器的方法:
//配置全局过滤器
Vue.filter('mySlice',function(value)
return value.slice(0,4)
)
Vue中的过滤器在页面中有两种配置方法:
1.插值语法实现:
//配置全局过滤器
Vue.filter('mySlice',function(value)
return value.slice(0,4)
)
//页面代码:
<h2>过滤器中设置只显示年份</h2>
time | timeFilters | mySlice
2.v-bind实现过滤器的配置:
//配置全局过滤器
Vue.filter('mySlice',function(value)
return value.slice(0,4)
)
//前端html页面中代码
<h2>测试过滤器的v-bind用法</h2>
<input type="text" :x = "msg | mySlice">
过滤器总结:
1.定义:对要显示的数据进行特定格式化后再显示(适用于一些简单的逻辑处理)
2.语法:
(1)注册过滤器:Vue.filter(name, callback) 或 new Vue(filters:)
(2)使用过滤器:xxx | 过滤器名 或 v-bind:属性 = “xxx | 过滤器名”
备注:
(1)过滤器也可以接收额外的参数,多个过滤器也可以实现串联
(2)并没有改变技术的数据,是产生新的对应的数据
040-v-text指令
重点:v-text会拿到name的值,然后替换掉div中原来的数据。
<div v-text="name"></div>
注意:v-text会将其中的数据都当做正常的文本进行解析,尽管其中含有很多’h2’等页面标签,但它并不会解析页面标签。
v-text作用:向其所在的标签中渲染data中的数据内容。
//截止到2022.8.16晚上22:56为止
以上是关于尚硅谷Vue系列教程学习笔记的主要内容,如果未能解决你的问题,请参考以下文章