IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 08——Vue中的计算属性与监视属性 -> 正文阅读

[JavaScript知识库]08——Vue中的计算属性与监视属性

在这里插入图片描述
需求分析:
两个输入框进行联动,全名随着两个输入框的输入而变化拼接

使用差值语法实现

<!DOCTYPE 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>姓名案例_差值语法实现</title></title>
	<!-- 引入vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
	<!-- 准备好一个容器 -->
	<div id="root">
		姓:<input type="text" v-model="firstName"><br/><br/>
		名:<input type="text" v-model="lastName"><br/><br/>
		全名:<span>{{firstName.slice(0, 3)}}--{{lastName}}</span>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false // 设置为 false 以阻止 vue 在启动时生成生产提示。
		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三'
			}
		})
		console.log(vm)
	</script>
</body>

</html>

使用methods实现

<!DOCTYPE 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>姓名案例_methods实现</title></title>
	<!-- 引入vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
	<!-- 准备好一个容器 -->
	<div id="root">
		姓:<input type="text" v-model="firstName"><br/><br/>
		名:<input type="text" v-model="lastName"><br/><br/>
		全名:<span>{{fullName()}}</span>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false // 设置为 false 以阻止 vue 在启动时生成生产提示。
		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三'
			},
			methods: {
				fullName() {
					return this.firstName + '-' + this.lastName
				}
			}
		})
		console.log(vm)
	</script>
</body>

</html>

computed 计算属性实现

computed计算属性

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

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

  • 3、get函数什么时候执行?
    (1)初次读取时会执行一次
    (2)当依赖的数据发生改变时会被再次调用

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

  • 5、备注
    (1)计算属性最终会出现在vm上,直接读取使用即可
    (2)如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变
    (3)如果计算属性确定不考虑修改,可以使用计算属性的简写形式

<!DOCTYPE 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>姓名案例_计算属性实现</title>
	</title>
	<!-- 引入vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
	<!-- 准备好一个容器 -->
	<div id="root">
		姓:<input type="text" v-model="firstName"><br /><br />
		名:<input type="text" v-model="lastName"><br /><br />
		全名:<span>{{fullName}}</span>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false // 设置为 false 以阻止 vue 在启动时生成生产提示。
		const vm = new Vue({
			el: '#root',
			data: {
				firstName: '张',
				lastName: '三'
			},
			computed: {
				// fullName: {
				// 	// get 有什么作用?当有人读取 fullName时,get就会被调用,且返回值就作为 fullName 的值
				// 	// get 什么时候调用?1、初次读取fullName 时 2、所依赖的数据发生变化时
				// 	get() {
				// 		console.log("get 被调用了");
				// 		return this.firstName + '-' + this.lastName
				// 	},
				// 	// set 什么时候调用,当fullName 被修改时
				// 	set(value) {
				// 		const arr = value.split('-');
				// 		this.firstName = arr[0]
				// 		this.lastName = arr[1]
				// 	}
				// },
				// 简写
				fullName() {
					console.log('get被调用了');
					return this.firstName + '-' + this.lastName
				}
			}
		})
		console.log(vm)
	</script>
</body>

</html>

监听属性

<!DOCTYPE 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>姓名案例_差值语法实现</title></title>
	<!-- 引入vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
	<!-- 准备好一个容器 -->
	<div id="root">
		<h2>今天天气很{{info}}</h2>
		<!-- <button @click="isHot = !isHot">切换天气</button> -->
		<button @click="changeWeather">切换天气</button>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false // 设置为 false 以阻止 vue 在启动时生成生产提示。
		new Vue({
			el:'#root',
			data:{
				isHot:true
			},
			computed:{
				info() {
					return this.isHot ? '炎热' : '凉爽'
				}
			},
			methods: {
				changeWeather() {
					this.isHot = !this.isHot
				}
			},
		})
	</script>
</body>

</html>

侦听属性基本用法

watch监视属性

  • 1、当被监视的属性变化时,回调函数自动调用,进行相关操作
  • 2、监视的属性必须存在,才能进行监视,既可以监视data,也可以监视计算属性
  • 3、配置项属性**immediate:false,改为 true,**则初始化时调用一次 handler(newValue,oldValue)
  • 4、监视有两种写法
    (1)创建Vue时传入watch: {}配置
    (2)通过vm.$watch()监视
<!DOCTYPE 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>天气案例_监视属性</title>
	</title>
	<!-- 引入vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
	<!-- 准备好一个容器 -->
	<div id="root">
		<h2>今天天气很{{info}}</h2>
		<!-- <button @click="isHot = !isHot">切换天气</button> -->
		<button @click="changeWeather">切换天气</button>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false // 设置为 false 以阻止 vue 在启动时生成生产提示。
		const vm = new Vue({
			el: '#root',
			data: {
				isHot: true
			},
			computed: {
				info() {
					return this.isHot ? '炎热' : '凉爽'
				}
			},
			methods: {
				changeWeather() {
					this.isHot = !this.isHot
				}
			},
			// 第一种监视写法:如果很明确监视对象 用这个
			// watch:{
			// 	isHot:{
			// 		// immediate: true, 初始化时让handler 调用一下
			// 		// handler 什么时候调用?当isHot发生改变时
			// 		handler(newValue, oldValue) {
			// 			console.log('isHot 被修改了', newValue, oldValue);
			// 		}
			// 	}
			// }
		})
		// 第二种监视写法
		vm.$watch('isHot', {
			// immediate: true, 初始化时让handler 调用一下
			// handler 什么时候调用?当isHot发生改变时
			handler(newValue, oldValue) {
				console.log('isHot 被修改了', newValue, oldValue);
			}
		})
	</script>
</body>

</html>

深度监听

深度监听

  • 1、Vue中的watch默认不监测对象内部值的改变(一层)
  • 2、在watch中配置deep:true可以监测对象内部值的改变(多层)

注意

  • 1、Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以
  • 2、使用watch时根据监视数据的具体结构,决定是否采用深度监视
<!DOCTYPE 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>天气案例_深度监视</title>
	<script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
	<div id="root">
		<h3>a的值是:{{ numbers.a }}</h3>
		<button @click="numbers.a++">点我让a+1</button>
		<h3>b的值是:{{ numbers.b }}</h3>
		<button @click="numbers.b++">点我让b+1</button>
		<button @click="numbers = {a:666,b:888}">彻底替换掉numbers</button>
		{{numbers.c.d.e}}
	</div>
</body>
<script type="text/javascript">
	Vue.config.productionTip = false
	const vm = new Vue({
		el: '#root',
		data: {
			isHot: true,
			numbers: {
				a: 1,
				b: 1,
				c: {
					d: {
						e: 100
					}
				}
			}
		},
		watch: {
			// 监视多级结构中某个属性的变化
			/* 'numbers.a':{
					  handler(){
						  console.log('a被改变了')
					  }
				  } */
			// 监视多级结构中所有属性的变化
			numbers: {
				deep: true,
				handler() {
					console.log('numbers改变了')
				}
			}
		}
	})
</script>

</html>

监听的简写方法

<!DOCTYPE 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>天气案例_深度监视</title>
	<script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
	<div id="root">
		<h2>今天天气很好{{info}}</h2>
		<button @click="changeWeather">切换天气</button>

	</div>
</body>
<script type="text/javascript">
	Vue.config.productionTip = false
	const vm = new Vue({
		el: '#root',
		data: {
			isHot: true,
		},
		computed: {
			info() {
				return this.isHot ? '炎热' : '凉爽'
			}
		},
		methods: {
			changeWeather() {
				this.isHot = !this.isHot
			}
		},
		watch: {
			// 正常写法
			isHot: {
				// immediate: true, 初始化时让handler 调用一下
				// handler 什么时候调用?当isHot发生改变时
				handler(newValue, oldValue) {
					console.log('isHot 被修改了', newValue, oldValue);
				}
			},
			// 简写形式
			isHot(newValue, oldValue) {
				console.log('isHot 被修改了', newValue, oldValue);
			}
		}
	})
	// 正常写法
	vm.$watch('isHot', {
		// immediate: true, 初始化时让handler 调用一下
		// handler 什么时候调用?当isHot发生改变时
		handler(newValue, oldValue) {
			console.log('isHot 被修改了', newValue, oldValue);
		}
	})
	// 简写 简写的代码不能写immediate这样的配置项
	vm.$watch('isHot', function(newValue, oldValue) {
		console.log('isHot 被修改了', newValue, oldValue);
	})
</script>

</html>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:43:07  更:2022-07-20 18:43:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:03:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码