- <body>
- <div id="app">
- <p v-if="isShow">表白成功p>
- <p v-else>表白失败p>
- <hr>
- <p v-show="isShow">求婚成功p>
- <p v-show="!isShow">求婚失败p>
- <button @click="changeIsShow">切换button>
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:'#app',
- data:{
- isShow:true
- },
- methods: {
- changeIsShow(){
- this.isShow = !this.isShow
- }
- },
- })
- script>
- body>
vif 和 vshow都是条件渲染有什么区别?
vif后面的条件如果为真,当前元素才会渲染,也就是说条件为假的元素内存中都不存在
vshow后面的条件无论是真还是假,都会进行渲染,也就是说条件为假的元素内存中仍然存在,只是使用css隐藏了
vif和vshow根据使用场景的不同,效率是不一样的
如果我们切换的频率很高,vshow比较合适,因为不需要重复的去渲染元素,内存也不需要重复的去创建销毁
如果我们切换的频率不高,vif比较合适,因为内存占用比较少,效率比较高
后期我们会使用组件标签,组件创建有生命周期,如果我们使用vif在组件标签身上
假设条件为假,这个组件是不会创建了,内存当中没有组件对象
如果使用的是vshow在组件标签身上,那么不管条件是真还是假,这个组件都会创建,生命周期都会执行对应的钩子
从输入url回车,到页面渲染完成经历了什么?
1、dns解析,本质是把域名解析为 ip:端口
2、tcp建立连接 三次握手
3、http请求发送请求报文
4、后台服务器返回响应报文
5、浏览器拿到响应报文后,解析渲染
html ---- domTree
css ---- cssTree
把生成的domTree和cssTree合并为renderTree 进行渲染
6、和后台断开连接 四次挥手
- <body>
- <div id="app">
- <ul>
-
- <li v-for="(person,index) in persons" :key="person.id">
- {{person.id}} --- {{person.username}} --- {{person.age}}
- li>
- ul>
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:'#app',
- data(){
- return {
- persons:[
- {id:1,username:'zhaoliying',age:35},
- {id:2,username:'yangmi',age:36},
- {id:3,username:'dilireba',age:30}
- ]
- }
- }
- })
- script>
- body>
vue如何去监视数据变化而更新页面(点击按钮修改第一项)
1、修改数组当中对象的属性,发现页面可以改变
2、通过数组的下标直接修改数组当中的整个对象,发现页面改变不了
3、调用数组的方法直接修改数组当中的整个对象,发现页面也可以改变
原因:
修改数组当中对象的属性,都是可以修改的,因为对象的所有属性都添加了get和set方法(响应式数据),
data当中所有的对象的属性,都是响应式
通过下标直接修改数组整个对象,不可以展示到页面,但是数据确实改了,数组的下标没有get和set通过数组的方法去修改整个对象也是可以修改的,因为vue当中重写了数组的部分原生方法,额外添加了展示到页面的功能
对象数据和数组数据响应式的区别
- <body>
- <div id="app">
- <ul>
- <li v-for="(person, index) in persons" :key="person.id">
- {{person.id}} --- {{person.username}} --- {{person.age}}
- li>
- ul>
- <button @click="update">点击修改第一个人的名字button>
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:"#app",
- data(){
- return {
- persons:[
- {id:1,username:'zhaoliying',age:35},
- {id:2,username:'yangmi',age:36},
- {id:3,username:'dilireba',age:30}
- ]
- }
- },
-
- methods: {
- update(){
- // this.persons[0].username = 'yingbao'
- // this.persons[0] = {id:1,username:'yingbao',age:35}
- this.persons.splice(0,1,{id:1,username:'yingbao',age:35})
- }
-
- },
- })
- script>
- body>
vue在处理数据的时候响应式是按照以下规则来的
对于对象
当我们一旦实例化vm实例的时候,vue内部会做数据劫持,把
data当中所有的对象属性(包括深层次),都添加了getter和setter
让每个属性都是响应式的
因此第一项成功了
对于数组
数组的响应式是修改了7个方法,只要使用的是下面7个方法当中的、
那么一定响应式,其实本质就是给这些数组方法添加了修改页面的功能而已
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
所以第三种可以
- <body>
- <div id="app">
- <input type="text" v-model="keyword">
- <ul>
-
-
-
- <li v-for="(person, index) in newPersons" :key="person.id">
- {{person.id}} --- {{person.username}} --- {{person.age}}
- li>
- ul>
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:"#app",
- data(){
- return {
- persons:[
- {id:1,username:'zhaoliying',age:35},
- {id:2,username:'yangmi',age:36},
- {id:3,username:'dilireba',age:30}
- ],
- keyword:''
- }
- },
- computed: {
- newPersons(){
- let {persons,keyword} = this
- return persons.filter(item => item.username.indexOf(keyword) !== -1)
- }
- },
- })
- script>
- body>
vfor和vif能不能同时使用? 答案是肯定的
vfor和vif同时使用的时候,谁的优先级高:答案是vfor
但是不推荐vfor和vif同时使用,因为vfor本身会出现很多个元素,每个元素身上都有一个指令v-if
vif指令都是需要进行解析的,指令进行解析的过程是很消耗性能的,这样效率就会很低下
原因是效率极低解决办法:
计算属性,我们通过计算属性把需要展示的数据,计算为一个新数组,展示的时候我们不和原数组拉关系
这样的话,vfor遍历直接遍历计算出来的新数组即可
- <body>
- <div id="app">
- <input type="text" v-model="keyword">
- <ul>
-
-
-
- <li v-for="(person, index) in newPersons" :key="person.id">
- {{person.id}} --- {{person.username}} --- {{person.age}}
- li>
- ul>
-
-
-
- <button @click="changeFlag(0)">原样排序button>
- <button @click="sortFlag = 1">年龄升序button>
- <button @click="sortFlag = 2">年龄降序button>
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:"#app",
- data(){
- return {
- persons:[
- {id:1,username:'zhaoliying',age:35},
- {id:2,username:'yangmi',age:36},
- {id:3,username:'dilireba',age:30}
- ],
- keyword:'',
- sortFlag:0 //设计排序标志数据
- }
- },
- computed: {
- newPersons(){
- let {persons,keyword,sortFlag} = this
- let arr = persons.filter(item => item.username.indexOf(keyword) !== -1)
- // if(sortFlag){
- // if(sortFlag === 1){
- // arr.sort((a,b) => {
- // return a.age - b.age
- // })
- // }else{
- // arr.sort((a,b) => {
- // return b.age - a.age
- // })
- // }
- // }
- if (sortFlag) arr.sort((a,b) => sortFlag === 1? a.age - b.age : b.age - a.age)
- return arr
- }
- },
-
- methods: {
- // 如果后期写函数,函数内部只有一行代码
- // 可以省略函数
-
- changeFlag(flag){
- this.sortFlag = flag
- }
- },
-
- })
- script>
- body>
列表的过滤和排序
列表过滤:
1、收集用户输入的关键字 需要设计收集的数据 vmodel收集keyword
2、页面展示的不再是原数组,而是根据原数组和keyword计算出来的新数组,否则就会碰到vfor和vif同时使用
3、页面展示的数据替换为新数组
列表排序(过滤后排序)
1、要排序需要设计排序标识数据 sortFlag 0原样 1升序 2降序
2、添加点击事件,点击三个按钮我们只需要负责修改sortFlag数据
3、sortFlag的改变是要引起过滤的新数组进行改变,sortFlag也得加入到计算当中去
4、过滤完成之后,只需要根据sortFlag的值,进行排序过滤出来的数组即可
强制绑定样式class和style
class动态绑定:
1、类名不确定 字符串形式
2、类名确定,但是不知道哪个生效 对象形式
3、类名有几个都生效 数组形式
style动态绑定
1、必须把原来的东西写在对象当中,样式名不变,样式值是动态的
2、样式名如果不合法,要变为小驼峰写法
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- <style>
- .classA{
- font-size: 80px;
- }
- .classB{
- color: hotpink;
- }
- .classC{
- background-color: greenyellow;
- }
- .classD{
- font-size: 30px;
- }
- style>
- head>
- <body>
- <div id="app">
-
-
- <p class="classD" :class="myClass" >我爱你赵丽颖p>
-
-
- <p :class="{classA:isA,classB:isB}">我爱你赵丽颖p>
-
-
- <p :class="classArr">我爱你赵丽颖p>
-
-
-
-
- <p :style="{fontSize,color:myColor}">我爱你赵丽颖p>
-
- <button @click="updateClass">点击改变样式button>
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:'#app',
- data(){
- return {
- myClass:'classA',
- isA:true,
- isB:false,
- classArr:['classA','classB','classC'],
- fontSize:'100px',
- myColor:'skyblue'
-
- }
- },
- methods: {
- updateClass(){
- this.isA = !this.isA
- this.isB = !this.isB
- }
- },
- })
- script>
- body>
事件绑定方法
v-on 只是绑定事件的复杂写法
@ 只是简写
1、回调写法
回调不需要自己加括号,直接写函数名即可,函数在定义的时候第一个形参接收的就是事件对象
2、函数调用
函数调用是自己加括号调用,调用的时候,vue会自动在我们写的函数调用外层添加一个函数,这个函数才是真正的回调
这个函数默认是有一个形参叫$event,(不能更改), 我们在写的函数调用如果需要把事件对象传递下去,那么就得传实参
$event,我们的函数定义就需要去接收这个参数,拿到事件对象去使用,如果不需要就不用传,函数内部也就拿不到事件对象。 如果我们传递参数不光要事件对象,还需要自己定义的参数,那么此时,需要在函数调用的时候,传递两个,一个是
$event,一个是自己的参数$event后期我们称为叫做默认参数,在原生dom事件当中只要见到$event,代表的就是事件对象
- <body>
- <div id="app">
-
- <button v-on:click="test">testbutton>
-
- <button @click="test">testbutton>
-
- <button @click="test1($event)">test1button>
-
-
-
- <button @click="test2(10,$event)">test2button>
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:'#app',
- data(){
- return {
-
- }
- },
- methods: {
- test(event){
- console.log(event.target.innerHTML);
- },
- test1(event){
- console.log(event.target.innerHTML);
- },
- test2(num,event){
- console.log(event.target.innerHTML,num);
- }
- },
-
- })
- script>
- body>
自动收集表单数据v-model的应用
输入框数据 输入的数据会自动赋值给data的数据
单选框数据 选中的value值会自动付给data的数据
多选框数据 单个使用操作的是布尔值 多个使用操作的是value值
下拉菜单数据 选中的option的value值会自动赋值给data的数据
文本域数据 写上的文本会自动赋值给data的数据
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- head>
- <body>
- <div id="app">
-
-
- 用户名: <input type="text" placeholder="请输入用户名" v-model="userInfo.username"> <br>
- 密 码: <input type="password" placeholder="请输入密码" v-model="userInfo.password"><br>
-
-
- 性 别:
-
- <label><input type="radio" name="sex" value="male" v-model="userInfo.gender">男label>
- <label><input type="radio" name="sex" value="female" v-model="userInfo.gender">女label> <br>
- 爱 好:
-
-
- <label><input type="checkbox" value="basketball" v-model="userInfo.favs">🏀label>
- <label><input type="checkbox" value="football" v-model="userInfo.favs">⚽label>
- <label><input type="checkbox" value="ping-pang" v-model="userInfo.favs">🏓label> <br>
- 城 市:
-
- <select v-model="userInfo.cityId">
-
- <option :value="city.id" v-for="(city, index) in cities" :key="city.id">
- {{city.name}}
- option>
- select> <br>
- 个人简介:
-
- <textarea cols="30" rows="10" v-model="userInfo.desc">textarea>
- <br>
-
- <input type="checkbox" v-model="userInfo.isChecked">同意协议
- <button @click="submit">提交button>
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:'#app',
- data(){
- return {
- userInfo:{
- username:'',
- password:'',
- gender:'',
- favs:[],
- cityId:2,
- desc:'',
- isChecked:false
- },
- cities:[
- {id:1,name:'西安'},
- {id:2,name:'北京'},
- {id:3,name:'上海'},
- ]
- }
- },
- methods: {
- // submit(){
- // axios({
- // url:'./xxx',
- // method:'post',
- // data:this.userInfo
- // })
- // }
- },
- })
- script>
- body>
- html>