【Vue】全套$...方法使用

一、事件

监听事件:$on

  • $on:监听当前实例上的自定义事件。
  • 事件可以由 vm.$emit 触发,回调函数会接收所有传入事件触发函数的额外参数。
  • 语法:vm.$on( event, callback )
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<button type="button" @click="$emit('test')">事件按钮</button>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			var app = new Vue({
				el: "#app",
				data: {
					
				},
				methods:{
					test(){
						console.log('test事件触发了');
					}
				}
			})
			app.$on('test', function() {
				console.log('$on事件触发了');
			})
		</script>
	</body>
</html>
  • 运行结果:

在这里插入图片描述

监听一次:$once

  • $once:监听一个自定义事件,但是只触发一次。一旦触发之后,监听器就会被移除。
  • 语法:vm.$once( event, callback )
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<button type="button" @click="$emit('test')">事件按钮</button>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			var app = new Vue({
				el: "#app",
				data: {
					
				},
				methods:{
					test(){
						console.log('test事件触发了');
					}
				}
			})
			app.$once('test', function() {
				console.log('$on事件触发了');
			})
		</script>
	</body>
</html>
  • 运行结果:多次点击只触发一次
    在这里插入图片描述

移除监听:$off

  • $off移除自定义事件监听器。
  • 语法:vm.$off( [event, callback] )
1. 如果没有提供参数,则移除所有的事件监听器;
2. 如果只提供了事件,则移除该事件所有的监听器;
3. 如果同时提供了事件与回调,则只移除这个回调的监听器。
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<button type="button" @click="$emit('test')">事件按钮</button>
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			var app = new Vue({
				el: "#app",
				data: {
					
				},
			})
			app.$once('test', function() {
				console.log('$on事件触发了');
			})
			app.$off("test")
		</script>
	</body>
</html>
  • 运行结果:事件将不会再触发

在这里插入图片描述

触发事件:$emit

  • $emit:触发当前实例上的事件。附加参数都会传给监听器回调。
  • 语法:vm.$emit( eventName, […args] )
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<child  @childclick="changeTT"></child>
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			//子组件
			var child = {
				template: `<button @click="childFun">子组件按钮</button>`,
				methods: {
					childFun() {
						this.$emit("childclick", 88);
					}
				}
			}
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					
				},
				components: {
					child,
				},
				methods: {
					changeTT(value) {
						console.log("父组件的触发了:", value);
					},
				}
			})
		</script>
	</body>
</html>
  • 运行结果:点击按钮后

在这里插入图片描述

二、数据

监听数据:$watch

  • 语法:
// 键路径
vm.$watch('a.b.c', function (newVal, oldVal) {
  // 做点什么
})

// 函数
vm.$watch(
  function () {
    // 表达式 `this.a + this.b` 每次得出一个不同的结果时
    // 处理函数都会被调用。
    // 这就像监听一个未被定义的计算属性
    return this.a + this.b
  },
  function (newVal, oldVal) {
    // 做点什么
  }
)

// vm.$watch 返回一个取消观察函数,用来停止触发回调:
var unwatch = vm.$watch('a', cb)
// 之后取消观察
unwatch()
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<input type="text" v-model="msg" />
		</div>
		<button type="button" onclick="unwatch()">取消监听</button>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			var app = new Vue({
				el: "#app",
				data: {
					msg: ''
				},
			})
			// 键路径
			var unwatch =  app.$watch('msg', function(newVal, oldVal) {
				console.log(newVal, oldVal);
			})
		</script>
	</body>
</html>
  • 运行结果:未点击取消监听前
    在这里插入图片描述

  • 运行结果:点击取消监听后
    在这里插入图片描述

添加数据:$set

  • 语法:用法可参考Vue.set
/*
	target: 要设置的对象或数组,
	propertyName/index:要设置的属性名或数组索引,
	value:要设置的值
*/
vm.$set( target, propertyName/index, value )
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			{{json}}
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			var app = new Vue({
				el: "#app",
				data: {
					json: {
						name: 'jj',
					}
				},
			})
			app.$set(app.json, "age", 18)
		</script>
	</body>
</html>
  • 运行结果:

在这里插入图片描述

删除数据:$delete

  • 语法:用法可参考Vue.delete
/*
	target: 要设置的对象或数组,
	propertyName/index:要设置的属性名或数组索引,
*/
vm.$delete( target, propertyName/index)
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			{{json}}
		</div>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			var app = new Vue({
				el: "#app",
				data: {
					json: {
						name: 'jj',
						age: 18
					}
				},
			})
			app.$delete(app.json, 'name')
		</script>
	</body>
</html>

  • 运行结果:
    在这里插入图片描述

三、生命周期

手动挂载:$mount()

  • 如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。
  • 可以使用 vm.$mount() 手动地挂载一个未挂载的实例。
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			{{msg}}
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			// 声明vue的对象
			var app = new Vue({
				// el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					msg: "hello world"
				},
			})
			app.$mount("#app")	// 将 Vue 实例挂载到dom节点
		</script>
	</body>
</html>
  • 运行结果:
    在这里插入图片描述

在这里插入图片描述

强制渲染:$forceUpdate()

迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件

  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			{{log()}}
			<child></child>
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			var child = {
				data() {
					return {}
				},
				template: `<div>我是子组件{{test()}}</div>`,
				methods: {
					test() {
						console.log('子组件渲染了');
					}
				}
			}
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					
				},
				methods: {
					log:function() {
					console.log("父组件渲染了");
				}},
				components:{
					child
				}
			})
			app.$forceUpdate()	// 父组件将再次渲染
		</script>
	</body>
</html>
  • 运行结果:

在这里插入图片描述

延迟更新:$nextTick()

  • $nextTick:将回调延迟到下次 DOM 更新循环之后执行。
  • 在修改数据之后立即使用它,然后等待 DOM 更新。
  • 它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<input type="text" v-show="isShow" ref="myinput" />
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					isShow: false
				},
				mounted: function() {
					this.isShow = true;
					// 视图还没更新完,就获取到了dom节点的信息,此时获取不到输入框的焦点
					// this.$refs.myinput.focus();
					// 这个问题可以使用 nextTick来解决
					// nextTick 有一个参数 ,是回调函数,作用是,等待 视图更新后,在执行 回调函数中的代码
					// 此时就能获取到输入框的焦点
					this.$nextTick(() => {
						this.$refs.myinput.focus();
					})
				}
			})
		</script>
	</body>
</html>
  • 运行结果:

在这里插入图片描述

在这里插入图片描述

销毁实例:$destroy()

完全销毁一个实例。清理它与其它实例的连接,解绑它的全部指令及事件监听器。

  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<input type="text" v-model="msg">
		</div>
		<button onclick="destroy()">销毁</button>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					msg:"",
				},
				watch:{
					msg(val){
						// 组件销毁后,将不再打印
						console.log(val);
					}
				},
				beforeDestroy() {
					console.log("beforeDestroy触发了");
				},
				destroyed(){
					console.log("destroyed触发了");
				}
			})
			function destroy() {
				//销毁 app 实例与 DOM 之间的关联
				app.$destroy();
			}
		</script>
	</body>
</html>
  • 运行结果:

在这里插入图片描述

四、属性

根元素:$el

  • Vue 实例使用的根 DOM 元素。

  • 示例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
				{{msg}}
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					msg: "vue对象成功挂载到dom节点"
				},
			})
		</script>
	</body>
</html>
  • 运行结果:
    在这里插入图片描述

根属性:$root

  • $root: 可以获取到根节点的所有属性,如果当前实例没有父实例,此实例将会是其自己。

  • 示例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<child></child>
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			//子组件
			var child = {
				data() {
					return {
						mm: ""
					}
				},
				template: `<div>子组件{{mm}}</div>`,
				mounted() {
					this.$root.test();
					this.mm = this.$root.msg;
				}
			}
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					msg: "hello"
				},
				methods: {
					test() {
						console.log("根节点的函数");
					}
				},
				computed: {
					bar() {
						console.log("根节点的计算属性");
					}
				},
				components: {
					child
				}
			})
		</script>
	</body>
</html>
  • 运行结果:
    在这里插入图片描述

父组件:$parent

  • $parent:父实例,如果当前实例有的话。
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<child></child>
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			//子组件
			var child = {
				data() {
					return {
						mm: "",
						childtext: "我是子组件"
					}
				},
				template: `<div>子组件{{mm}}</div>`,
				mounted() {
					//在子组件获取父组件的数据,可以使用 parent
					console.log(this.$parent);
					this.mm = this.$parent.msg;
				}
			}
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					msg: "hello"
				},
				components: {
					child
				}
			})
		</script>
	</body>
</html>
  • 运行结果:
    在这里插入图片描述

子组件:$children

  • $children:当前实例的直接子组件。
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			{{msg}}
			<button @click="test">触发</button>
			<child></child>
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			//子组件
			var child = {
				data() {
					return {
						mm: "",
						childtext: "我是子组件"
					}
				},
				template: `<div>子组件</div>`,
			}
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					msg: "hello"
				},
				components: {
					child
				},
				methods: {
					test() {
						console.log("根节点的函数");
						//注意:$children 的使用你必须知道子组件的下标,没有办法使用
						this.msg = this.$children[0].childtext;
					}
				},
				mounted() {
					console.log(this.$children);
				},
			})
		</script>
	</body>
</html>
  • 运行结果:未点击触发前

在这里插入图片描述

  • 运行结果:点击触发后
    在这里插入图片描述

各组件:$refs

  • $refs 使用 ,是在 js原生组件或 自定义组件上写 ref 属性

  • 调用时,需要写成 this.$refs.ref的属性名.*****

  • 尽量不使用refs,因为他没有使用虚拟dom ,性能稍差

  • 示例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<div ref="oDiv">父组件的div{{message}}</div>
			<child ref="child"></child>
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			//子组件
			var child = {
				data() {
					return {
						msg: 'hello'
					}
				},
				template: `<div>我是子组件</div>`,
				methods: {
					test() {
						console.log('子组件的函数被触发了');
					}
				}
			}
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					message: ""
				},
				components: {
					child
				},
				mounted() {
					console.log(this);
					console.log(this.$refs.oDiv);
					//普通的div的使用refs修改其属性
					this.$refs.oDiv.style.color = "green";
					//使用 refs获取子节点的属性
					console.log(this.$refs.child.msg);
					this.message = this.$refs.child.msg;
					this.$refs.child.test();
				}
			})
		</script>
	</body>
</html>
  • 运行结果:
    在这里插入图片描述

各配置:$options()

  • $options():用于当前 Vue 实例的初始化选项。需要在选项中包含自定义 property 时会有用处:
new Vue({
  customOption: 'foo',
  created: function () {
    console.log(this.$options.customOption) // => 'foo'
  }
})
  • 示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<input type="text" v-model="msg">
			<button @click="log()">打印</button>
		</div>
		<!-- 引入vue插件 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
		<script>
			// 声明vue的对象
			var app = new Vue({
				el: "#app", // 将vue对象挂载到dom节点
				data: { // 定义vue对象的数据
					msg:"222",
				},
				methods: {
					log(){
						console.log(this.$options);
					}
				}
			})
		</script>
	</body>
</html>
  • 点击打印后:

在这里插入图片描述

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值