前言

本文非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. (1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积。int getCircumference():获得图形的周长 (2)编写一个圆类Circle,要求:圆类Circle实现接口ShapePara。 该类包含有成员变量: radius:public 修饰的double类型radius,表示圆的半径。 x:private修饰的double型变量x,

    package com.hanqi.test; //创建接口 public interface ShapePara { //获取面积的方法 double getArea(); //获取周长的方法 do ...

  2. Oracle表字段的增加、删除、修改和重命名

    本文主要是关于Oracle数据库表中字段的增加.删除.修改和重命名的操作. 增加字段语法:alter table tablename add (column datatype [default val ...

  3. 如何阻止h5body的滑动

    // 禁止 document.body.style.overflow = 'hidden'; function _preventDefault(e) { e.preventDefault(); } w ...

  4. msysGit管理GitHub代码

    msysGit管理GitHub代码   代码的管理,在日常开发中是很重要的环节,程序员的修炼三部曲——版本控制,单元测试,项目自动化. 本篇就简单的说说通过msysGit来管理GitHub中的代码,实 ...

  5. 解决SecureCRT中文编码乱码

    1.mysql表和列都已经设置UTF-8了,然后还是不能输入中文和中文显示乱码. 2.在SecureCRT下: 执行英文设置:export LANG=zh_CN.UTF-8后不能直接输入中文. 然后执 ...

  6. CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器

    一.简介 LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端.它提供了对日志的简单浏览.搜索.基本分析和一些图表报告的功能.数据可以从数据库或一般的syslog文本文件中获取 ...

  7. [转]NPOI导出EXCEL 打印设置分页及打印标题

    本文转自:http://www.cnblogs.com/Gyoung/p/4483475.html 在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方 ...

  8. 时光煮雨 Unity3d 序列目标点的移动①

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  9. 蜕变·WebRebuild 2013 前端年度交流会邀请

    联网web前端设计行业通过一段时期的茧封或焰炼,web技术使行业.企业及自身发生质的改变.痛苦的蜕变是成长的契机,在彼此互相冲击.交流.融合的对话下,将以尊重包容互助合作同步发展的心态,对行业蜕变.自 ...

  10. UVa10820 Send a Table[欧拉函数]

    Send a TableInput: Standard Input Output: Standard Output When participating in programming contests ...