前言

本文非vue教程,仅为学习vue过程中的个人理解与笔记,有说的不正确的地方欢迎指正讨论

1、computed计算属性函数中不能使用vm变量

在计算属性的函数中,不能使用Vue构造函数返回的vm变量,因为此时vm还未返回,依然处于Vue内部构造函数过程中,遂只能使用this来代替vm。

若要使用typescript,可使用以下方法来实现代码智能感知

vm = vm || this;

另:其他不能用vm变量,只能使用this变量的地方,都可以通过此方法来获得Typescript的智能感知和代码语法检查,比如mounted生命周期系列函数等。

不过模板里的vm引用Typescript无能为力,只能等待ts支持vue的jsx语法了╮(╯_╰)╭

2、计算属性中不能引用其他计算属性?

官方教程中没有找到相关说明(应该是我没找到),从使用角度而言大致可以总结出以下结论:

  1. 计算属性必须引用(依赖)非计算属性或固定值。(见demo1)
  2. 计算属性若引用(依赖)其他计算属性,则被引用的计算属性必须引用非计算属性或固定值(见demo2)
  3. 计算属性可循环依赖,但最终依赖链上的最上游的计算属性,必须引用非计算属性或固定值。

DEMO1:官方标准用法,计算属性引用非计算属性:

var vm = new Vue({
el: "#app",
data: {
dataVal: "xxcanghai"
},
computed: {
computedVal1: function () {
//标准用法,计算属性引用非计算属性
return this.dataVal + "_1";//输出 xxcanghai_1
}
}
});

DEMO2:计算属性链式依赖其他计算属性,则依赖链头必须引用非计算属性或固定值

var vm = new Vue({
el: "#app",
data: {
dataVal: "xxcanghai"
},
computed: {
computedVal1: function () {
return this.dataVal + "_1";
},
computedVal2: function () {
//合法,计算属性computedVal2引用computedVal1,computedVal1再引用dataVal
return this.computedVal1 + "_2";//输出 xxcanghai_1_2
}
}
});

原因很容易理解,如果最终没有引用或依赖任何非计算属性,那么计算属性在计算时会陷入死循环

3、vue2.0中若使用组件嵌套,则在父组件执行$forceUpdate()之前模板中$children为空数组

触发这个问题有以下几个前提:

  1. vue版本为2.0版本,1.0无此问题。
  2. 使用组件嵌套,在父组件的模板中访问$children变量
  3. 在渲染完成后没有再将$children变量写入过父组件的data变量(或其他vm数据)

    就会触发此问题。
<!--父组件HTML模板-->
<div id="app">
<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个问题。

触发此问题的前提:

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

复现代码:

<div id="app">
<!--子组件直接写在调用方的模板中-->
<parent>
<child></child>
<child></child>
<child></child>
</parent>
</div> //父组件
Vue.component("parent", {
template: "<p>parent child:{{$children.length}} </p>",//模板中无slot元素
mounted(){
this.$forceUpdate();
}
});
Vue.component("child", {
template: "<div>child</div>"
}); var vm = new Vue({
el: "#app"
});

解决方案1:父组件模板包含slot元素

在父组件的模板中加入slot元素。或在render函数中引用了this.$slots.default变量

Vue.component("parent", {
template: "<p>parent child:{{$children.length}} <slot></slot></p>",
mounted(){
this.$forceUpdate();
}
});

解决方案2:在父组件模板中编写子组件定义

此解决方案要修改此问题的复现第2要素,即子组件定义从调用方改为写到父组件的模板中也可解决此问题。

<div id="app">
<parent>
</parent>
</div> Vue.component("parent", {
//直接在父组件中写明调用子组件标签
template: "<p>parent child:{{$children.length}}\
<child></child>\
<child></child>\
</p>",
mounted(){
this.$forceUpdate();
}
});
Vue.component("child", {
template: "<div>child</div>",
}); var vm = new Vue({
el: "#app",
data: {
child: []
}
});

此方法虽然可以解决问题,但是有时我们直接把子组件写在调用方会更方便更利于理解,比如Tab与TabPage组件。

如下Tab组件代码,可能更符合一般人的使用思维:

<div id="app">
<tab>
<tab-page>Page1</tab-page>
<tab-page>Page2</tab-page>
<tab-page>Page3</tab-page>
</tab>
</div>

相关笔记

Vue学习笔记-1(http://www.cnblogs.com/xxcanghai/p/5849038.html)

Vue学习笔记-2(http://www.cnblogs.com/xxcanghai/p/6098663.html)

Vue学习笔记-2的更多相关文章

  1. Vue学习笔记-1

    前言 本文不是Vue.js的教程,只是一边看官网Vue的教程文档一边记录并总结学习过程中遇到的一些问题和思考的笔记. 1.vue和avalon一样,都不支持VM初始时不存在的属性 而在Angular里 ...

  2. vue 学习笔记(二)

    最近公司赶项目,一直也没时间看 vue,之前看下的都快忘得差不多了.哈哈哈,来一起回顾一下vue 学习笔记(一)后,继续向下看嘛. #表单输入绑定 基础用法 v-model 会忽略所有表单元素的 va ...

  3. vue学习笔记之:为何data是一个方法

    vue学习笔记之:为何data是一个方法 在vue开发中,我们可以发现,data中的属性值是在function中return出来的.可为何data必须是一个函数呢?我们先看官方的解释: 当一个组件被定 ...

  4. vue学习笔记(八)组件校验&通信

    前言 在上一章博客的内容中vue学习笔记(七)组件我们初步的认识了组件,并学会了如何定义局部组件和全局组件,上一篇内容仅仅只是对组件一个简单的入门,并没有深入的了解组件当中的其它机制,本篇博客将会带大 ...

  5. vue学习笔记(九)vue-cli中的组件通信

    前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...

  6. vue学习笔记(十)路由

    前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...

  7. AntDesign vue学习笔记(七)Form 读写与图片上传

    AntDesign Form使用布局相比传统Jquery有点繁琐 (一)先读写一个简单的input为例 <a-form :form="form" layout="v ...

  8. Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据

    目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...

  9. vue学习笔记(三)class和style绑定

    前言 通过上一章的学习vue学习笔记(二)vue的生命周期和钩子函数,我们已经更近一步的知道了关于vue的一些知识,本篇博客将进一步探讨vue其它方面的内容,vue中关于class和style绑定,关 ...

随机推荐

  1. Android,LIstView中的OnItemClick点击无效的解决办法

    在List_Item布局文件中的根节点加上如下背景标黄的这一行 <?xml version="1.0" encoding="utf-8"?> < ...

  2. nodejs学习资料

    官方文档 阿里nodejs7天快速教程 从零开始nodejs系列文章 一个周末掌握IT前沿技术之node.js篇 nodejs中文api文档    nodejs中文api文档(0.12.2) node ...

  3. linux centos6.5 ftp网页vsftpd配置

    安装命令centos下 yum install vsftpd 出现“Complete!”时意味着安装完成.Linux中,系统对于大小写严格区分,比如abc和ABC是完全不相同的字符,要特别注意.配置V ...

  4. java 读取文件——按照行取出(使用BufferedReader和一次将数据保存到内存两种实现方式)

    1.实现目标 读取文件,将文件中的数据一行行的取出. 2.代码实现 1).方式1: 通过BufferedReader的readLine()方法. /** * 功能:Java读取txt文件的内容 步骤: ...

  5. Linux screen 命令

    简单的来说 在screen里面敲的命令都是在后台的,所以不需要想bg那样,ctrl+z在bg把后台服务运行起来.而且下次可以直接进去screen作业的后台界面,可以看到我们过去敲的命令记录,即使你的C ...

  6. SVN报Previous operation has not finished; run 'cleanup' if it was interrupted错误的解决方法

    做着项目突然SVN报Previous operation has not finished; run 'cleanup' if it was interrupted,进度又要继续,烦.百度一下发现很多 ...

  7. C++11 之 override

    1  公有继承 派生类公有继承自 (public inheritance) 基类,继承包含两部分:一是函数的 "接口" (interface),二是函数的 "实现&quo ...

  8. CF 371B Fox Dividing Cheese[数论]

    B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...

  9. 第30课 Qt中的文本编辑组件

    1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...

  10. Unity arm64

    ERROR ITMS-90086 ERROR ITMS-90086:"missing 64-bit support. beginning on february 1, 2015, new i ...