vue.js页⾯加载执⾏created,mounted的先后顺序说明
created页⾯加载未渲染html之前执⾏。
javascript说明mounted渲染html后再执⾏。
由于created在html模板⽣产之前所以⽆法对Dom进⾏操作⽽mounted可以。
补充知识:关于Vue⼦组件data选项某个属性引⽤⼦组件props定义的属性的⼏点思考
学过Vue的都知道Vue等MVVM框架相对于传统的JS库⽐如Jquery最⼤的区别在于数据驱动视图,重点在于数据,拿到数据后将数据通过模板{{}}语法或者v-html展⽰在页⾯上。
我们也都知道在Vue⽗⼦组件可以通过Props实现⽗组件传递到⼦组件。
在项⽬开发中,我们会遇到这种需求,页⾯初始化时,⽗组件通过接⼝拿到需要数据,然后拿到的数据通过props传递给⼦组件。在⼦组件会有些业务上的操作来改变接受的props值注意Vue中⼦组件不能直接更改props值,这样会报错。
⽗组件需要拿到字组件改变后的值作为接⼝请求参数的值。
为了实现这种需求,我们⼀般会在data中定义某个属性,这个属性引⽤props的某个值。然后监听该数据,当该数据发⽣变化时,向⽗级组件传递⾃定义事件和改变后的值。
// ⼦组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>局部组件的使⽤</title>
</head>
<body>
<div id="app">
<h1>在有template选项时,#app⾥的内容不展⽰</h1>
</div>
</body>
<script src="cdn.jsdelivr/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
// 全局组件在声明时已经挂在到全局,可以直接使⽤
Vueponent('Parent', {
template: `
<div>
<p>我是⽗组件</p>
<Child :childDataA="msg"/>
</div>
`,
data() {
return {
msg: '传递给⼦组件的数据'
}
},
methods: {
childHandler(val) {
console.log(val)
}
}
})
Vueponent('Child', {
template: `
<div>
<p>我是⼦组件</p>
{{ childDataA }}
<input type="text" v-model="childDataA" @input="changeValue">
</div>
`,
/
/ 指定props属性的类型时,会对传⼊的参数进⾏类型检查,如果不符合就会报错
props: {
childDataA: {
type: String,
default: ''
},
childDataB: {
type: Object,
default: null
}
},
data() {
return {
msgA: this.childDataA,
msgB: this.childDataB
}
},
methods: {
changeValue() {
this.$emit('childHandler', this.msg)
}
}
})
// 声明局部组件App
const App = {
template: `
<div>
<Parent />
</div>
`
}
new Vue({
el: '#app',
data() {
return {
}
},
// 挂在⼦组件
components: {
App
},
//使⽤⼦组件
template: '<App/>'
})
</script>
</html>
在上⾯的代码中定义了⼦组件Child和⽗组件Parent,⼦组件的input框通过v-model绑定接受的props的childDataA,页⾯初始化如下
当在⽂本框输⼊其他值时
会提醒你避免直接更改props属性,⽽是基于props基础上定义data或者计算属性来操作。接下来我们看另外⼀种情况。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>局部组件的使⽤</title>
</head>
<body>
<div id="app">
<h1>在有template选项时,#app⾥的内容不展⽰</h1>
</div>
</body>
<script src="cdn.jsdelivr/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
// 全局组件在声明时已经挂在到全局,可以直接使⽤
Vueponent('Parent', {
template: `
<div>
<p>我是⽗组件</p>
<Child :childDataA="msg" :childDataB="msgB"/>
</div>
`,
data() {
return {
msg: '传递给⼦组件的数据',
msgB: {
name: '我是name属性'
}
}
},
methods: {
},
watch: {
msg(val) {
console.log(val)
},
msgB: {
deep: true,
handler: function(newVal, oldVal) {
console.log(newVal, oldVal)
}
}
}
})
Vueponent('Child', {
template: `
<div>
<p>我是⼦组件</p>
{{ childDataA }}
<input type="text" v-model="msgA">
<input type="text" v-model="msgB.name">
</div>
`,
// 指定props属性的类型时,会对传⼊的参数进⾏类型检查,如果不符合就会报错
props: {
childDataA: {
type: String,
default: ''
},
childDataB: {
type: Object,
default: null
}
},
data() {
return {
msgA: this.childDataA,
msgB: this.childDataB
}
},
methods: {
},
mounted() {
console.log(`msgA数据类型是${typeof this.msgA}`)
console.log(this.childDataA === this.msgA)
console.log(`msgB数据类型是${typeof this.msgB}`)
console.log(this.childDataB === this.msgB)
}
})
/
/ 声明局部组件App
const App = {
template: `
<div>
<Parent />
</div>
`
}
new Vue({
el: '#app',
data() {
return {
}
},
// 挂在⼦组件
components: {
App
},
//使⽤⼦组件
template: '<App/>'
})
</script>
</html>
页⾯
可以看到⽆论原始类型msgA和引⽤类型值msgB都和接受的props值时严格相等的。
分别改变两个⽂本框的值
只有45⾏打印出改变后的name值,也就是说data选项的msgA引⽤props的childDataA,childDataA是⼀个原始类型,msgA改变并不会导致childDataA发⽣变化。也就是⽗组件的msg不会发⽣改变。⽽msgB引⽤props的childDataB,childDataA是⼀个引⽤类型,msgB改变导致childDataB发⽣变化。也就是⽗组件的data选型中的msgB发⽣变化。
不⽤深究Vue源码是如何具体实现的,在⼦组件的mounted阶段可以看到两个值childDataA=== msgA,childDataB=== msgB。从这⾥我们可以得值,⽗组件的msgB和⼦组件的props中的childDataB以及data中的msgB都是的引⽤都是相同的,也就是引⽤同⼀个对象,其中⼀个属性值发⽣变化时,都会发⽣变化。⽽原始类型不会。
所以这⾥其实延伸到JS中的原始类型和引⽤类型相等的⽐较。
原始类型只要值相等即可严格相等(字符串编制值也要相等)
引⽤类型的⽐较是引⽤的⽐较,必须要求内存地址相同。如果两个对象属性即属性值完全相同,但引⽤不同(地址不同),那这两个对象是不严格相等的。
var a = 1
b = a
b // 1
b = 2
b // 2
a // 1
var objA = {name: 'A'}
var objB = objA
objB //{name: 'A'}
objB.name = 'B
objA.name // 'B'
上⾯说了这么多,有什么⽤呢。其实我们可以得到以下⼏点启发
在实际业务开发中,如果⼦组件接受的props属性值改变后,⽗组件data选项中的值也需要知道值发⽣变化,当存在多个这样的props属性时,可以定义我⼀个对象,这样可以避免多次在组件定义并在⽗组件接受⾃定义事件并作逻辑处理,⼿动将⽗组件data中的多个属性的值改成⾃定义事件接受的值。
⼦组件的props建议使⽤对象来定义,⽽不是数组,通过对象定义可以对接受的类型进⾏校验。
⽆论是Jq,还是Vue都是建⽴在原⽣JS的基础上,所以理解熟悉原⽣JS特别重要。
以上这篇vue.js页⾯加载执⾏created,mounted的先后顺序说明就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论