Vue基础(下)

发布于:2022-11-13 ⋅ 阅读:(779) ⋅ 点赞:(0)

8. 计算属性

1. 计算属性computed:

        1. 定义:要用的属性不存在,要通过已有属性计算得来。

        2. 原理:底层借助了Objcet.defineproperty方法提供的getter和setter。

        3. get函数什么时候执行?

                (1). 初次读取时会执行一次。

                (2). 当依赖的数据发生改变时会被再次调用。

        4. 优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。

        5. 注意:

                (1). 计算属性最终会出现在vm上,直接读取使用即可。

                (2). 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。

        2. 代码块

<div id="root">
	姓:<input type="text" v-model="firstName"> <br/><br/>
	名:<input type="text" v-model="lastName"> <br/><br/>
	全名:<span>{{fullName}}</span> <br/><br/>
</div>
computed:{
		fullName:{
		    //get有什么作用?当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
		    //get什么时候调用?1.初次读取fullName时。2.所依赖的数据发生变化时。
			get(){
			// console.log(this) //此处的this是vm
			return this.firstName + '-' + this.lastName
			},
			//set什么时候调用? 当fullName被修改时。
			set(value){
			const arr = value.split('-') //将数组用‘-’符号分割为数组
			this.firstName = arr[0]
			this.lastName = arr[1]
		}
    }
}

9. 监视属性

1. 监视属性watch:

        1. 当被监视的属性变化时, 回调函数自动调用, 进行相关操作

        2. 监视的属性必须存在,才能进行监视!!

        3. 监视的两种写法:

                (1). new Vue时传入watch配置

                (2). 通过vm.$watch监视

2. 深度监视:

        1. Vue中的watch默认不监测对象内部值的改变(一层)。

        2. 配置deep:true可以监测对象内部值改变(多层)。

        注意:

        1. Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!

        2. 使用watch时根据数据的具体结构,决定是否采用深度监视。

3. 代码块

<div id="root">
	姓:<input type="text" v-model="firstName"> <br/><br/>
	名:<input type="text" v-model="lastName"> <br/><br/>
	全名:<span>{{fullName}}</span> <br/><br/>
</div>
watch:{
	firstName(val){
		setTimeout(()=>{
			console.log(this)
			this.fullName = val + '-' + this.lastName
		},1000);
	},
	lastName(val){
		this.fullName = this.firstName + '-' + val
	}
}

4. computed和watch之间的区别:

        1. computed能完成的功能,watch都可以完成。

        2. watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。

        注意:

        1. 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。

        2. 所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。

10. 绑定样式

1. 绑定样式:

        1. class样式

                  写法:  class="xxx" xxx可以是字符串、对象、数组。

                            字符串写法适用于:类名不确定,要动态获取。

                            对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。

                            数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。

        2. style样式

                    :style="{fontSize: xxx}"其中xxx是动态值。

                    :style="[a,b]"其中a、b是样式对象。

        3. 代码块

<div id="root">
	<!-- 绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 -->
	<div class="basic" :class="mood" @click="changeMood">{{name}}</div> <br/><br/>

	<!-- 绑定class样式--数组写法,适用于:要绑定的样式个数不确定、名字也不确定 -->
	<div class="basic" :class="classArr">{{name}}</div> <br/><br/>

	<!-- 绑定class样式--对象写法,适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用 -->
	<div class="basic" :class="classObj">{{name}}</div> <br/><br/>

	<!-- 绑定style样式--对象写法 -->
	<div class="basic" :style="styleObj">{{name}}</div> <br/><br/>
	<!-- 绑定style样式--数组写法 -->
	<div class="basic" :style="styleArr">{{name}}</div>
</div>
const vm = new Vue({
	el:'#root',
	data:{
		name:'Web',
		mood:'normal',
		classArr:['atguigu1','atguigu2','atguigu3'],
		classObj:{
			atguigu1:false,
			atguigu2:false,
		},
		styleObj:{
			fontSize: '40px',
			color:'red',
		},
		styleObj2:{
			backgroundColor:'orange'
		},
		styleArr:[
			{
				fontSize: '40px',
				color:'blue',
			},
			{
				backgroundColor:'gray'
			}
		]
	},
	methods: {
		changeMood(){
			const arr = ['happy','sad','normal']
			const index = Math.floor(Math.random()*3)
			this.mood = arr[index]
		}
	},
})

11. 条件渲染

1. 条件渲染:

        1. v-if

                        写法:

                                (1). v-if="表达式"

                                (2). v-else-if="表达式"

                                (3). v-else="表达式"

                        适用于:切换频率较低的场景。

                        特点:不展示的DOM元素直接被移除。

                        注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。

        2. v-show

                        写法:v-show="表达式"

                        适用于:切换频率较高的场景。

                        特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉

        3. 注意:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。

2. 代码块

<div id="root">
    使用v-show做条件渲染
    <h2 v-show="false">欢迎来到{{name}}</h2>
    <h2 v-show="1 === 1">欢迎来到{{name}}</h2>

    使用v-if做条件渲染
    <h2 v-if="false">欢迎来到{{name}}</h2>
    <h2 v-if="1 === 1">欢迎来到{{name}}</h2>

    v-else和v-else-if
    <div v-if="n === 1">Angular</div>
    <div v-else-if="n === 2">React</div>
    <div v-else-if="n === 3">Vue</div>
    <div v-else>G</div>
</div>
const vm = new Vue({
	el:'#root',
	data:{
		name:'Web',
		n:0
	}
})

12. 列表渲染

1. Vue监视数据的原理:

        1. vue会监视data中所有层次的数据。

        2. 如何监测对象中的数据?

                通过setter实现监视,且要在new Vue时就传入要监测的数据。

                        (1).对象中后追加的属性,Vue默认不做响应式处理

                        (2).如需给后添加的属性做响应式,请使用如下API:

                                    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的根数据对象 添加属性!!!

13. 收集表单数据

1. 基本原理

        若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。

        若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值。

        若:<input type="checkbox"/>

                 1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)

                 2.配置input的value属性:

                       (1)v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)

                       (2)v-model的初始值是数组,那么收集的的就是value组成的数组

               备注:v-model的三个修饰符:

                         lazy:失去焦点再收集数据

                         number:输入字符串转为有效的数字

                         trim:输入首尾空格过滤

2. 代码块

<div id="root">
	<form @submit.prevent="demo">
		账号:<input type="text" v-model.trim="userInfo.account"> <br/><br/>
		密码:<input type="password" v-model="userInfo.password"> <br/><br/>
		年龄:<input type="number" v-model.number="userInfo.age"> <br/><br/>
		性别:
		男<input type="radio" name="sex" v-model="userInfo.sex" value="male">
		女<input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br/><br/>
		爱好:
		学习<input type="checkbox" v-model="userInfo.hobby" value="study">
		打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
		吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
		<br/><br/>
		所属校区
		<select v-model="userInfo.city">
			<option value="">请选择校区</option>
			<option value="beijing">北京</option>
			<option value="shanghai">上海</option>
			<option value="shenzhen">深圳</option>
			<option value="wuhan">武汉</option>
		</select>
		<br/><br/>
		其他信息:
		<textarea v-model.lazy="userInfo.other"></textarea> <br/><br/>
		<input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.atguigu.com">《用户协议》</a>
		<button>提交</button>
	</form>
</div>

14.过滤器

1. 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。

2. 语法:

        1.注册过滤器:Vue.filter(name,callback) 或 new Vue{filters:{}}

        2.使用过滤器:{{ xxx | 过滤器名}}  或  v-bind:属性 = "xxx | 过滤器名"

备注:

        1.过滤器也可以接收额外参数、多个过滤器也可以串联

        2.并没有改变原本的数据, 是产生新的对应的数据

        3.说白了,就是把一些不必要的东西过滤掉,过滤器实质不改变原始数据,只是对数据进行加工处理后返回过滤后的数据再进行调用处理,我们也可以理解其为一个纯函数。

15.内置指令

v-bind    : 单向绑定解析表达式, 可简写为 :xxx

v-model : 双向数据绑定

v-for      : 遍历数组/对象/字符串

v-on      : 绑定事件监听, 可简写为@

v-if        : 条件渲染(动态控制节点是否存存在)

v-else   : 条件渲染(动态控制节点是否存存在)

v-show  : 条件渲染 (动态控制节点是否展示)

v-text指令:

        1.作用:向其所在的节点中渲染文本内容。

        2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。

v-html指令:

        1.作用:向指定节点中渲染包含html结构的内容。

        2.与插值语法的区别:

                    (1).v-html会替换掉节点中所有的内容,{{xx}}则不会。

                    (2).v-html可以识别html结构。

        3.严重注意:v-html有安全性问题!!!!

                    (1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。

                    (2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!

v-cloak指令(没有值):

        1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。

        2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。

v-once指令:

            1.v-once所在节点在初次动态渲染后,就视为静态内容了。

            2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

v-pre指令:

        1.跳过其所在节点的编译过程。

        2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。

16.自定义组件

一、定义语法:

            (1).局部指令:

                        new Vue({                                                           new Vue({

                            directives:{指令名:配置对象}   或           directives{指令名:回调函数}

                        })                                                                      })

            (2).全局指令:

                            Vue.directive(指令名,配置对象) 或   Vue.directive(指令名,回调函数)

二、配置对象中常用的3个回调:

            (1).bind:指令与元素成功绑定时调用。

            (2).inserted:指令所在元素被插入页面时调用。

            (3).update:指令所在模板结构被重新解析时调用。

三、备注:

            1.指令定义时不加v-,但使用时要加v-;

            2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。

17.生命周期

1.又名:生命周期回调函数、生命周期函数、生命周期钩子。

2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。

3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。

4.生命周期函数中的this指向是vm 或 组件实例对象。

5.常用的生命周期钩子:

        (1).mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。

        (2).beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

6.关于销毁Vue实例

        (1).销毁后借助Vue开发者工具看不到任何信息。

        (2).销毁后自定义事件会失效,但原生DOM事件依然有效。

        (3).一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。

7.生命周期过程详解

Vue 的生命周期总共分为8个阶段:创建前/后,载入前/后,更新前/后,销毁前/后。

1、beforeCreate(创建前)

表示实例完全被创建出来之前,vue 实例的挂载元素$el和数据对象 data 都为 undefined,还未初始化。

2、created(创建后)

数据对象 data 已存在,可以调用 methods 中的方法,操作 data 中的数据,但 dom 未生成,$el 未存在 。

3、beforeMount(挂载前)

vue 实例的 $el 和 data 都已初始化,挂载之前为虚拟的 dom节点,模板已经在内存中编辑完成了,但是尚未把模板渲染到页面中。data.message 未替换。

4、mounted(挂载后)

vue 实例挂载完成,data.message 成功渲染。内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了。实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,DOM 渲染在 mounted 中就已经完成了。

5、beforeUpdate(更新前)

当 data 变化时,会触发beforeUpdate方法 。data 数据尚未和最新的数据保持同步。

6、updated(更新后)

当 data 变化时,会触发 updated 方法。页面和 data 数据已经保持同步了。

7、beforeDestory(销毁前)

组件销毁之前调用 ,在这一步,实例仍然完全可用。

8、destoryed(销毁后)

 


网站公告

今日签到

点亮在社区的每一天
去签到