文章目录
一、事件
监听事件:$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>
- 点击打印后: