vue.js 核心知识点二

- 2.1 v-on可以监听多个方法吗?

  • v-on 绑定单个或多个事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <input type="text" :value="name" @input="onInput" @focus="onFocus" @blur="onBlur" />
        <input v-on:keyup.enter="submit" v-on:focus="onFocus">
        <!-- <button v-on:click="myclick('hello','world','你好世界',$event)"  >button1</button> -->
        <button @click="myclick('hello','world','你好世界',$event)">点我text</button>
      

        <!-- v-on绑定多个事件教程里这样子写,但是貌似已经不支持这样子的写法了,
内联方式下事件处理器只能绑定一个方法,要是想要绑定多个事件,用下面第二行的方式-->
        <!-- <button v-on="{mouseenter: onEnter,mouseleave: onLeave}">鼠标进来</button> -->
        <button @mouseenter="onEnter" @mouseleave="onLeave">鼠标进来</button>
 
        <!-- 一个事件绑定多个函数,按顺序执行,这里分隔函数可以用逗号也可以用分号-->
        <button @click="a(),b()">点我ab</button>
        <button @click="one()">点我onetwothree</button>
 
        <!-- v-on修饰符  .stop .prevent .capture .self 以及指定按键.{keyCode|keyAlias} -->
        <!-- 这里的.stop 和 .prevent也可以通过传入&event进行操作 -->
        <!-- 全部按键别名有:enter tab delete esc space up down left right -->
        <form @keyup.delete="onKeyup" @submit.prevent="onSubmit">
            <input type="text" placeholder="在这里按delete">
            <button type="submit">点我提交</button>
        </form>
 
    </div>
    
    <script src="vue221.js"></script>
    <script>
        var vm = new Vue({
            el:"#app",
            methods:{
                //这里是es6对象里函数写法
                a(){console.log("a");},
                b(){console.log("b");},
                one(){
                    console.log("one");
                    this.two();
                    this.three();
                },
                two(){
                    console.log("two");
                },
                three(){
                    console.log("three");
                },
                myclick(msg1,msg2,msg3,event){
                    console.log(msg1+msg2+"--"+msg3);
                    console.log(event);
                },
                onKeyup(){
                    console.log("you press 'delete'");
                },
                onSubmit(){
                    console.log("sumited");
                },
                onEnter(){
                    console.log("mouse enter");
                },
                onLeave(){
                    console.log("mouse leave");
                }
            }
        });
    </script>
</body>
</html>

- 2.2 vue中 key 值的作用

数组的v-for
item in items
item of items
item,index in items
(item,index) in items

对象的v-for(键值,键名,索引)
value in object
(value, key) in object
(value, key, index) in object
key的作用主要是为了高效的更新虚拟DOM。
另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,
其目的也是为了让vue可以区分它们,
否则vue只会替换其内部属性而不会触发过渡效果。

key的用法一般是:key='id',意思是为元素绑定一个key属性,这个key属性为元素添加了一个唯一身份标识符。
之后,当数据改变,Vue底层通过对比能够更快的获取到更新的内容并显示到页面上。
总之就是一句话,key属性能够提升性能(主要作用于数据更新时)。

- 2.3 vue-cli工程升级vue版本

package.json 里面修改vue的版本 同时修改 vue-template-compiler 为相同的版本.后者在devdepen....里面.然后npm install;
在项目目录里运行 npm upgrade vue vue-template-compiler,不出意外的话,可以正常运行和 build。如果有任何问题,删除 node_modules 文件夹然后重新运行 npm i 即可。

- 2.4 基于Vue cli生成的Vue项目的webpack4升级

参考大佬https://www.colabug.com/3206468.html
https://github.com/littlematch0123/blog-client
https://github.com/littlematch0123

- 2.5 vue事件中如何使用event对象?

div id="app">
    <button v-on:click="click">click me</button>
</div>
...
var app = new Vue({
    el: '#app',
    methods: {
        click(event) {
            console.log(typeof event);    // object
        }
    }
});
<div id="app">
    <button v-on:click="click()">click me</button>
</div>
...
var app = new Vue({
    el: '#app',
    methods: {
        click(event) {
            console.log(typeof event);    // undefined
        }
    }
});
<div id="app">
    <button v-on:click="click($event, 233)">click me</button>
</div>
...
//获取事件对象 , 方法参数传递  $event 
var app = new Vue({
    el: '#app',
    methods: {
        click(event, val) {
            console.log(typeof event);    // object
        }
    }
});
<div id="app">
    <button v-on:click="click(233)">click me</button>
</div>
...
var app = new Vue({
    el: '#app',
    methods: {
        click(val) {
            console.log(typeof event);    // object
        }
    }
});

第一种是没有带圆括号,注意这时在处理函数的形参中是定义了 event 的,vue 在执行的时候,自动将 event 对象作为参数传入到其中了,所以我们取到的 event 对象其实是真正传入到处理函数中的参数,一定程度上可以理解成是该函数的局部变量;
第二种是带了圆括号的,这时的形参表里并没有定义 event 这一个参数,当前作用域并没有定义 evnet 这一个对象,所以 js 会尝试在定义这个处理函数的上级作用域中搜索 event 变量,仍未找到,最终到达全局作用域上,找到了 window.event 这一个对象,但是这一个对象并不是我们期望的 event 对象。
准确的说,是因为这一个对象存在兼容性问题,js 代码中常见的 var event = event || window.event; 就是这个道理,查 MDN 上说只有 IE/Edge/Chrome 支持。(实际上 Safari 也支持)

<li v-for="img in willLoadImg" @click="selectImg($event)">
    <img class="loadimg" :src="img.url" :data-id="img.id"  alt="">
</li>
currentTarget:currentTarget 事件属性返回其监听器触发事件的节点,即当前处理该事件的元素、文档或窗口。
通俗一点说,就是你的点击事件绑定在哪一个元素上,currentTarget获取到的就是哪一个元素。

target:target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素、文档或窗口。
通俗一点说,就是你当前点击的是哪一个元素,target获取到的就是哪一个元素。

methods: {
    selectImg(event) {
            console.log(event.currentTarget);
            console.log(event.target);
    }
}
//获得event对象兼容性写法 
event || (event = window.event);
//获得target兼容型写法 
event.target||event.srcElement
//阻止浏览器默认行为兼容性写法 
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
//阻止冒泡写法 
event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);

- 2.6 $nextTick的使用

this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。

假设我们更改了某个dom元素内部的文本,而这时候我们想直接打印出这个被改变后的文本是需要dom更新之后才会实现的,也就好比我们将打印输出的代码放在setTimeout(fn, 0)中;

- 2.7 Vue 组件中 data 为什么必须是函数?

类比引用数据类型
Object是引用数据类型,如果不用function 返回,每个组件的data 都是内存的同一个地址,一个数据改变了其他也改变了;
javascipt只有函数构成作用域(注意理解作用域,只有函数的{}构成作用域,对象的{}以及 if(){}都不构成作用域),data是一个函数时,每个组件实例都有自己的作用域,每个实例相互独立,不会相互影响

const MyComponent = function() {};
MyComponent.prototype.data = {
    a: 1,
    b: 2,
}
const component1 = new MyComponent();
const component2 = new MyComponent();

component1.data.a === component2.data.a; // true;
component1.data.b = 5;
component2.data.b // 5

如果两个实例同时引用一个对象,那么当你修改其中一个属性的时候,另外一个实例也会跟着改;

两个实例应该有自己各自的域才对,需要通过下面的方法来进行处理

const MyComponent = function() {
    this.data = this.data();
};
MyComponent.prototype.data = function() {
    return {
        a: 1,
        b: 2,
    }
};

这样每一个实例的data属性都是独立的,不会相互影响了.因此每个实例可以维护一份被返回对象的独立的拷贝
所以,你现在知道为什么vue组件的data必须是函数了吧。这都是因为js本身的特性带来的,跟vue本身设计无关。其实vue不应该把这个方法名取为data(),应该叫setData或其他更容易理解的方法名。

- 2.8 v-for 与 v-if 的优先级

当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你想为仅有的一些项渲染节点时,这种优先级的机制会十分有用,如下:

<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo }}
</li>

上面的代码只传递了未完成的 todos。

而如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 <template>)上。如:

<ul v-if="todos.length">
  <li v-for="todo in todos">
    {{ todo }}
  </li>
</ul>
<p v-else>No todos left!</p>

题外话
永远不要把 v-if 和 v-for 同时用在同一个元素上。
一般我们在两种常见的情况下会倾向于这样做:

为了过滤一个列表中的项目 (比如 v-for="user in users" v-if="user.isActive")。在这种情形下,请将 users 替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表。

为了避免渲染本应该被隐藏的列表 (比如 v-for="user in users" v-if="shouldShowUsers")。这种情形下,请将 v-if 移动至容器元素上 (比如 ul, ol)。

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

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,047评论 0 29
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,774评论 0 38
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,341评论 0 25
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,204评论 0 6
  • 又是一年春来到,唉,又长了一岁。除了每年准时收看的充满年气息的春晚,年的味道似乎离我们越来越远。 静悄悄的...
    菲儿dancer阅读 193评论 0 4