首页 > 其他分享 >《属性篇》属性watch

《属性篇》属性watch

时间:2024-01-16 14:55:32浏览次数:18  
标签:console name watch 组件 监听 路由 属性

参考链接:https://www.runoob.com/vue2/vue-watch.html

监听属性,watch实际上用来监听vue中数据的变化。

监听String

<template>
	<div @click="stringClick">{{msg}}</div>
</template>
<script>
export default {
	name: "jianting",
	data() {
		return {
			msg: "1223"
		};
	},
	watch: {
		msg: function(newVal, oldVal) {
			console.log("newVal:", newVal,  "oldVal:", oldVal) // 新值,旧值
		}
	},
	methods: {
		stringClick() {
			this.msg = Math.random() * 100;
		}
	}
};
</script>

监听对象

 <template>
	<div @click="click">
		<div>
			姓名:{{obj.name}},
			年龄:{{obj.age}},
			他的儿女有:
		</div>
		<div 
			v-for="(item, index) in obj.children" 
			:key="index">
			姓名:{{item.name}},
			年龄:{{item.age}}
		</div>
	</div>
</template>

<script>
export default {
	name: "jianting",
	data() {
		return {
			obj: {
				name: "Tony",
				age: 50,
				children: [
					{
						name: "小明",
						age: 12
					},
					{
						name: "小花",
						age: 5
					}
				]
			}
		};
	},
	watch: {
		obj: {
			handler: function(newVal, oldVal) {
				console.log("newVal:", newVal);
				console.log("oldVal:", oldVal);
			},
			deep: true, // 深度监听
			immediate: true // 立即执行
		},

		// 监听对象中的某个值
		"obj.name": function(newVal, oldVal) {
			console.log("newVal obj.name:", newVal);
			console.log("oldVal obj.name:", oldVal);
		}
	},
	methods: {
		click() {
			this.obj.name = "未知";
		}
	}
};
</script>

watch监听对象的时候,需要加deep:true,只有这样才能深入底层去实时监听,没有加的话,对象是监听不到变化的,添加immediate时会在侦听开始之后被立即调用

监听路由

通过watch监听,当路由发生变化时执行

方法一监听一级路由
监听一级路由:路由组件的渲染区域为router-view,
作为顶层出口,它将匹配到的路由组件渲染在该区域中,
路由组件渲染默认的方式是销毁 - 创建,
因此$ watch是监听不到一级路由的变化的。
所以,要想使用$router监听一级路由,需要让组件成为复用组件,
也就是使用keep-alive包裹router-view。

<keep-alive>
     <router-view />
</keep-alive>

  watch: {
	$route: {
		handler: function(to, from) {
			console.log(to,'新',from, '旧');
			 if(from && (from.name === 'adoptSelect')){
				this.active = 2
			}
		},
		// 深度观察监听
		deep: true,
		immediate: true
	}
}

方法二 监听子路由:
需要在有子路由的情况下,才能在当前组件监听到子组件的路由变化,直接使用下面的方式即可。

watch:{
	$route(to, from){
		console.log('去哪里',to,  '从哪里来',from)
		console.log(to.path)
	}
}

或者

 watch: {
  '$route.path': function (newVal, oldVal) {
   if (newVal === '/login') {
	console.log('欢迎进入登录页面');
   }
   if (newVal === '/register') {
	console.log('欢迎进入注册页面');
   }
  }
 }

方法三

watch: {
   '$route' : 'getPath' // 获取路径
},
methods: {
   getPath(){
	 console.log( this .$route.path);
   }
}

key-用来阻止“复用”的

Vue 为我们提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可(Vue文档原话)

<router-view :key= "key" ></router-view>

computed: { //计算属性
   key() {
	 return  this .$route.name !== undefined 
	 ?
	 this .$route.name + new  Date() 
	 :
	 this .$route + new  Date()
   }
}

使用computed属性和Date()可以保证每一次的key都是不同的,
这样就可以如愿刷新数据了。

全局监听路由

(通过vue-router的钩子函数
beforeRouteEnter
/beforeRouteUpdate
/beforeRouteLeave)

一般会在router里面加跳转验证才会用到这个方法

方法一 监听路由导航守卫

watch:{
   $route(to,from){
	 if (to.path ==  '/'  || to.path ==  '/Prisoner'  || to.path ==  '/Goods'  || to.path ==  '/Time'  || to.path ==  '/Mine' ){
	   /**
		* $store来自Store对象
		* dispatch 向 actions 发起请求
		*/
	   this .$store.dispatch( 'showTabBar' );
	 } else {
	   this .$store.dispatch( 'hideTabBar' );
	 }
   }
 },

 beforeRouteEnter (to, from, next) {
   // 在渲染该组件的对应路由被 confirm 前调用
   // 不!能!获取组件实例 `this`
   // 因为当钩子执行前,组件实例还没被创建
	if(from.name !== 'adoptDetail'){
		  next({
			  path:'/adopt'
		  })
	  }else{
		  next()
	  }
 },
 beforeRouteUpdate (to, from, next) {
   // 在当前路由改变,但是该组件被复用时调用
   // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
   // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
   // 可以访问组件实例 `this`
 },
 beforeRouteLeave (to, from, next) {
   // 导航离开该组件的对应路由时调用
   // 可以访问组件实例 `this`
 },

方法二:
在app.vue的create中加入下面代码,然后进行判断

this.$router.beforeEach((to ,from,next) =>{
   console.log(to);
   next(); 
})

等等方法

标签:console,name,watch,组件,监听,路由,属性
From: https://www.cnblogs.com/fusio/p/17967656

相关文章

  • Spring 工具:StopWatch 计时器
    工具类:org.springframework.util.StopWatch作用:记录方法执行耗时,统计每个方法的耗时占比所在模块:spring-core方法描述voidstart(StringtaskName)开始一个新的监测任务,可设置任务名称。记录当前时间和任务名称voidstop()结束当前监测任务。记录任务执行......
  • js对象属性名表达式
    let propKey='foo'; let obj={  [propKey]:true,  ['a' +'bc']:123};通过先定义变量,在字面量对象中添加属性时,属性名为变量时加上中括号包裹,也可以为表达式来表示......
  • 将文本转换为块的属性
    同事提出了这样一个需求,将文本(DBText)转换为块的属性值,我尝试着使用如下的流程实现了该操作,使用Civil3d将文本移动到对应高程,创建Civil3d曲面,提取点(AutoCAD的Point),转换生成几何空间点(CogoPoint),之后通过几何空间点生成属性块。但生成的属性块属性标签无法设置也无法修改,......
  • Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和
    一、类型(Types)一、OpenPopupOptions1.属性windowId:number可选打开操作弹出式窗口的窗口ID。如果未指定,则默认为当前活动窗口。二、TabDetails1.属性tabId:number可选要查询其状态的标签页ID。如果未指定标签页,则返回非标签页专属状态。三、UserSettin......
  • js Global 对象属性
    Global对象有很多属性,其中一些前面已经提到过了。像undefined、NaN和Infinity等特殊值都是Global对象的属性。此外,所有原生引用类型构造函数,比如Object和Function,也都是Global对象的属性。undefinedNaNInfinityObjectArrayFunctionBooleanString特殊值undefi......
  • HTML DOM对象-方法和属性
    HTMLDOM对象-方法和属性一些常用的HTMLDOM方法:getElementById(id)-获取带有指定id的节点(元素)getElementsByTagName()  返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。 返回节点列表。节点列表是一个节点数组。getElementsByClassName()  返回......
  • 69.OSwatcher安装
    1.从mos上下载oswbb包,下载后再解压2.设置环境变量,该目录是采集信息的归档目录,可以配置到/etc/profile中  exportOSWBB_ARCHIVE_DEST=/oradata/app/archiveexportOSWHOME=/oradata/app/oswbb3.启动./startOSWbb.sh            --该脚......
  • 【转载】SAP程序属性中的固定点算术
    【转载地址】:https://www.cnblogs.com/zohoo/p/17337504.htmlSAP程序创建时,程序属性面板中有一个选项叫做“固定点算术”,默认是勾上的,如下图所示:通过按F1在该选上调取帮助说明,可以看到官方是这样解释的:如果标记该复选框,该程序中的所有计算都将使用定点运算。如果未标......
  • Python教程(22)——Python面向对象的属性和方法
    在Python面向对象编程中,属性和方法是类及其对象的重要组成部分。如果说封装、继承和多态是面向对象编程中的思想,那么类的属性和方法就是骨架,因为有属性和方法,面向对象编程才变的有血有肉。属性属性是类或对象所拥有的数据,它用于描述对象的特征和状态。属性可以是实例属性(对象特......
  • 如何使用vue的watch
    在Vue.js中,watch是一个对象,你可以使用它来观察和响应Vue实例上的数据变化。当被观察的数据发生变化时,对应的回调函数将会被执行。以下是如何使用watch的基本示例:javascriptnewVue({el:'#app',data:{message:'HelloVue!'},watch:{message:function(ne......