Vue 注意事项

简单地来理解Vue,把mvvm什么的都撇开~


0. 大小写不敏感

由于js和html之间要进行沟通,而vue读取到的html中定义的变量/函数/方法为小写,所以请尽量用纯小写/下划线/连词符代替。


1. 为什么是new Vue({el:'#myApp'.....})

这是对应网页中id为myApp的对象

<div id='myApp'.......

而如果网页中tag的class为myApp要记住灵活运用,把new Vue({el:'#myApp'.....})改为new Vue({el:'.myApp'....."), 易可写成new Vue({el:'div.myApp'.....")

参考jquery查询元素方式


2.只能存在一个Vue对象么?

只存在一个vue。可创建多个,官方不建议,且在3.x会报错。


3.设计网页中的变量怎么实现的数据链接呢?

通过网页中查找{{.*}}特征对象,也是为了兼容浏览器的妥协


4.特征值查询

条件v-if,逻辑v-for,插件,绑定参数v-bind:.*,事件v-on:click 等也都是通过解析网页达到二次处理的


4.1. 补充 Vue的结构

el
获取网页模版对象,可以通过类似jquery方式查询到,比如<div id='abc' class='xyz'>,那么可以写成new Vue({el:'#abc'}) 或者 new Vue({el:'.xyz'})或者new Vue({el:'div#abc'}) 或者 new Vue({el:'div.xyz'})。 这些都是灵活的,并非刻板,只要能找到网页中对应的DOM对象标签就可以。

_data
传递的值(必须小写),可以是变量定义,数组定义,也可以是字典,灵活运用数据结构,这里data不加s,本身数据就是一个结合。

components
组件群的定义,记住这是个容器。

watch
监控data中对应值的变化。

methods
@click等事件处理

computed
对变量的灵活处理,可以把存取变量分离开来,包括对变量的get/set处理

filters
过滤函数,相当于便捷化的处理函数,在{{}}中就能进行调用,缺点是格式固定,一个变量可进行多个过滤函数处理


5.值的自动变更

当更改变量值时,引用的{{}}对象也会自动变更,这是MVVM机制,简单来讲,{{}}并不只被渲染为固定值,而是将原始结构作为模版,达到刷新替换的效果


6.过滤器 filter

{{}}中可以对值进行过滤,结构是{{变量1,变量2,变量3... | 过滤器1 | 过滤器2 | 过滤器3 ...}},过滤器可以是多个,参数也可以是多个
比如设计器中写入 {{ "你好, 世界! " , 3 | doChange | doChange2}}
开发代码中插入过滤器

filters:{
  doChange: function(p1,p2) {
    var p="";
    for(let i=0;i<p2;i++){
      p+=p1;
    }
    return [p,p2];
  },
  doChange2: function(p1) {
    for(let i=0;i<p1[1];i++){
      p1[0] = p1[0].replace('世界', ' 中国' );
    }
    return p1[0];
  }
}

输出

你好, 中国! 你好, 中国! 你好, 中国!

进入第二个过滤器时无法传递多个参数,通过数组方式传递进去,这时候如果不传递过滤器则只替换了第一个世界,这里只是举个例子,repace使用RegEx过滤可以进行全局过滤 p1[0] = p1[0].replace(/世界/g, ' 中国' );


7.变量和计算函数重名?

首先会报错,但不影响运行,运行时优先读取变量值。


8. 解析{{}}优先级

变量/属性property > 计算函数computed > 数值/字符串计算 > 过滤器filter(直接被识别为空)
过滤器filter不在优先级中,因为过滤器在|识别符后,直接写filter是无效的(虽然filter传参并不会报错)


9. 观察和死循环

当进行观察watch时小心逻辑卡死
写这样一个结构

<div id='div'>
<p>{{a}}//{{b}}</p>
<button v-on:click="click1()">按钮</button>

code:

var div = new Vue({
    el: #div,
    data: {
        a: 1,
        b: 2,
    },
    watch: {
        a: function() {
            this.b++
            console.log(b, this.b);
        },
        b: function() {
            this.a++
            console.log(a, this.a);
        }
    },
}

当a/b任意一个值变动时,网页会进入假死状态,其实不用两个值,只要watch的时候更改自己的值就会导致假死

注意不要在watch中更改属性变量本身的值


10. 计算Computed的setter和getter

computed:{
    var_b: {
        get: function(){
            //读变量处理
        },
        set: function(){
            //设置变量处理逻辑
        }
    }
}

11. 箭头函数 ?

貌似在Vue内部是不能定义箭头函数的,但是在整个代码环境下是可以使用箭头函数的,Vue对象内部可以调用箭头函数

let output = (str)=>{return console.log(str)}

调用

cCount: {
  get:function () {
    strange(this.count)
    return this.count * 100
  },
  set:function (val) {
    this.count = val/100
  }
}

这里可以成功使用箭头函数创建的方法


12. 多条件处理 v-if v-else v-elseif

这里我写了个假枚举,用来支持开关变量

<div id="div">
<h1 v-if="type==Type.Type_1">类型1</h1>
<h1 v-else-if="type==Type.Type_2">类型2</h1>
<h1 v-else-if="type==Type.Type_3">类型3</h1>
<h1 v-else>类型type={{type}}</h1>
</div>

代码

var div = new Vue({
    el:'#div',
    data:{
    Type:{
        Type_None:0,
        Type_1:1,
        Type_2:2,
        Type_3:3,
    },
    type:null,
])

div.type = div.Type.Type_2;

条件判断内不支持位操作符号(|,&,^,~),使用后结果会不正确,|被解析成了过滤器


13. v-model

双向绑定,相当于增加了对变量属性的设置功能,强化版的{{}},但他并没有{{}}灵活。

对象 作用 变量类型
input checkbox 当选中时,将对象的value传入变量数组 数组变量
input radio 当选中时,将对象的value传入变量 字符串变量
input text 更改变量,默认值会替换placeholder值 字符串变量
input button 属性值决定了按钮上显示的文字 字符串变量
input image 无效果
input password 更改变量,默认值会替换placeholder值 字符串变量

14. 什么时候需要{{}} ?

当需要在和普通内容混编多时候需要{{}},当在特殊关键字下不需要,比如v-ifv-forv-onv-model,这些关键字都明确说明了之后的处理和vue有关,就不需要{{}}了


15.当checkbox和radio遇上v-for

错误写法:

<input v-for="(item, index) in radios" :key="index" name="1" type="radio" v-bind:value="item" v-model="radioxx">{{item}}

这样的循环无法得到{{item}}值
解决方式

<label v-for="(item, index) in radios" :key="index">
   <input name="1" type="radio" v-bind:value="item" v-model="radioxx">{{item}}
</label>

本身input不包含额外标签,即便后面跟着item和</>结束符,得到的值也只是input自己在循环,这时候只需要在外嵌套一个不影响排版的标签就可以令按钮横排显示



16. 组件(component)的内部结构

组件既可以单独创建,也可以在vue中创建,区别在于直接在对象下创建的组件直接对应字典数据表
Vue.component('组件名称',{组件结构})
Vue({ compenents:{ '组件名称':{组件结构} } })
组件结构:

templete
重中之重,一个组件可以没有props传参,可以没有data数据,也可以没有computed处理,但必须有模版本身的内容。

props
props,数组/字典。
传递数组时,可接收的参数格式为 v-bind:变量名='值/其他变量名':变量名='值/其他变量名'格式, 可以传递多个变量值。
传递字典时,每个key对应的数据结构{ type:数据类型(String/Number/Boolean/Object),default:默认返回处理函数,required:是否必须,validator:验证函数返回真假},如果数据为Object结构,则变量传递不全会丢失数据,而不会传递缺省的值.String类型使用key="value"方式传递,其他类型使用:key="value"方式传递。

data
数据,和Vue直接定义的data不同,这里是需要创建一个返回函数,data:function(){return {data结构} }, 写起来有些拗。

computed
计算,获得的变量通过一定方式处理获得computed:{ name: function(){ return 'abc' } } 或者经过get/set处理。

methods
同vue的methods,事件处理

记住定义的变量名必须为全小写,如果html结构中进行了大写操作,在传递后会强制转换为小写,但Vue的语法又对大小写敏感,你会拿不到任何值,比如:valFromMajor='value', 那么获得的变量名为valfrommajor,不写成小写会拿不到值。这个问题同样出现在Vue的data定义中。需要绑定的数据链必须是在html中,而不能是在templete模版中,否则会当成普通字符串处理。


17. 事件的发送 / 发射器 / $emit

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容

  • 序言:乱七八糟一锅粥! 基于Vue.js 教程、介绍— Vue.js 心得: 在vue中,推荐始终使用 kebab...
    苦苦修行阅读 648评论 0 1
  • Vue简介 2014年诞生,2013年react,09年angularjs 作者: 尤雨溪 核心概念: 组件化 双...
    简单就好wfc阅读 1,569评论 0 1
  • Vue学习笔记 Vue初始化对象 data和methods里面的属性都是Vue这个实例对象的代理属性,例:vm.m...
    土豪码农阅读 998评论 1 1
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,048评论 0 29
  • vue学习笔记 安装 Vue 提供一个官方命令行工具,可用于快速搭建大型单页应用。只需几分钟即可创建并启动一个带热...
    EL_PSY_CONGROO阅读 1,059评论 0 5