关于Vue.js一些问题和思考学习笔记(2)

2020-06-16 06:17:54易采站长站整理

<div>{{$children.length}}</div> <!--此处显示0,应该为3-->
<child></child>
<child></child>
<child></child>
</div>

//子组件代码
Vue.component("child", {
template: "<div>child</div>",
});

//父组件声明
new Vue({
el: "#app",
});

如下图:

解决方案1:使用$forceUpdate()

注册父组件的mounted方法,执行$forceUpdate()


<div id="app">
<div>{{$children.length}}</div>
<child></child>
<child></child>
<child></child>
</div>

Vue.component("child", {
template: "<div>child</div>",
});

new Vue({
el: "#app",
mounted: function () {
this.$forceUpdate();//强制重新绘制
}
});

$children正确了:

解决方案2:使用vm的变量代替$children

注册父组件的mounted方法,将$children赋值给自定义的vm的变量。
同时模板中使用自定义的变量来代替默认的$children


<div id="app">
<div>{{child.length}}</div> <!--使用自定义的child对象-->
<child></child>
<child></child>
<child></child>
</div>

Vue.component("child", {
template: "<div>child</div>",
});

var vm = new Vue({
el: "#app",
data: {
child: [] },
mounted: function () {
this.child = this.$children;//手动将$children对象赋值给自定义child变量
}
});

至于导致此问题的原因只能通过阅读vue2.0版本的源码才能了解了。

4、若父组件的template或render函数中无引用slot元素,则$children恒等于空数组

此问题关联上面第3个问题。
触发此问题的前提:

vue2.0版本
父组件和子组件都直接写在调用方模板中
在模板中访问$children变量
已经解决在上述问题3中强制刷新的问题


<div id="app">
<!--子组件直接写在调用方的模板中-->
<parent>
<child></child>
<child></child>