vue基础问题

import HelloWorld from '@/components/HelloWorld'中的@是什么意思

默认从src下面的目录开始查找模块

resolve:{
  alias: {
    '@': resolve(" src ")
  }
}

因为在webpack.base.config中做了resolve.alias配置,为src目录下的文件创建了别名“@”,以便import或者require指定的module时更容易,所以"@"的意思是从src下面的目录开始查找模块。


Vue.use()作用

Vue.use(plugin)用于引入一个插件。
参数为一个对象或者函数,是对象的时候必须要有install方法。
首先会判断插件是否已经注册,

  • 如果已经注册,则直接返回。
  • 如果没有注册,则:
    (1)toArray()用于把类数组argument转化为数组,然后通过unshift()将数组右移,在数组首部添加this对象,也就是Vue对象。
    (2) 如果传入的是对象,那就调用插件的install方法并通过apply()方法将install方法改变this的指向为plugin。
    args作为参数传递给install方法。
    (3)插件类型为function时,插件运行的上下文this指向null(严格模式下;非严格模式下指向window)
    (4)installedPlugins.push(plugin)在这之后将插件push到插件数组中,表示已注册。
    源码如下:
  Vue.use = function (plugin) {
    /* istanbul ignore if */
    if (plugin.installed) {
      return
    }
    // additional parameters
    var args = toArray(arguments, 1);
    args.unshift(this);
    if (typeof plugin.install === 'function') {
      plugin.install.apply(plugin, args);
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args);
    }
    plugin.installed = true;
    return this
  };

  function toArray (list, start) {
    start = start || 0;
    var i = list.length - start;
    var ret = new Array(i);
    while (i--) {
      ret[i] = list[i + start];
    }
    return ret
  };

Vue.set(target, propertyName/index, value) 或者 this.$set(target, propertyName/index, value)

参数:
{Object | Array} target
{string | number} propertyName/index
{any} value
this.$set是Vue.set()的一个别名
向响应式数据中添加一个属性,并且保证该属性也是响应式的,且触发视图的更新。它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性。

为什么要用Vue.set()或者this.$set();

受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。
要处理这种情况,我们可以使用$set()方法,既可以新增属性,又可以触发视图更新。


computed, watch, methods的区别

  • computed是在HTML DOM加载完成之后就执行
    methods需要一定的触发条件,比如点击事件
    watch用于观察数据,默认的执行顺序是先执行computed,再watch,不执行methods;当触发点击事件时,则先调用methods,再watch
  • computed是计算属性,对于计算结果会缓存。除非依赖的响应式属性变化才会重新计算。注意,如果某个依赖 (比如非响应式属性) 在该实例范畴之外,则计算属性是不会被更新的。这就意味着只要依赖的属性还没有发生改变,多次访问计算属性会立即返回之前的计算结果,而不必再次执行函数。
  • watch只能观察一个响应式属性。(包括通过vue.set()添加的响应式属性)当需要在数据变化时执行异步操作或者开销比较大的操作时,可以用watch。

修饰符


v-prev,v-cloak, v-once

v-prev: 跳过元素和他的子元素的编译过程,可以用来显示原始mustache标签。跳过大量没有指令的节点会加快编译。
v-cloak: 保持在元素上直到关联实例编译结束。比如和display: none结合使用。可以隐藏未编译的mustache标签直到编译结束。
v-once: 只渲染元素和组件一次。随后的重新渲染,将会作为静态内容跳过。可以用来优化性能。


[https://www.jianshu.com/p/db2ab955c351]


vue-router导航守卫

  • 全局导航守卫:
    beforeEach(to,from,next);
    beforeResolve();
    afterEach(to,from)
  • 路由守卫:
    beforeEnter(to,from,next);
  • 组件导航守卫:
    beforeRouteEnter(to,from,next);此时组件实例还没有被创建,不能获取this;beforeRouteEnter 是支持给 next 传递回调的唯一守卫。
    beforeRouteUpdate(to,from,next);
    beforeRouteLeave(to,from,next);

完整的导航解析流程

  • 导航被触发。
  • 在失活的组件里调用离开守卫。
  • 调用全局的 beforeEach 守卫。
  • 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
  • 在路由配置里调用 beforeEnter。
  • 解析异步路由组件。
  • 在被激活的组件里调用 beforeRouteEnter。
  • 调用全局的 beforeResolve 守卫 (2.5+)。
  • 导航被确认。
  • 调用全局的 afterEach 钩子。
  • 触发 DOM 更新。
  • 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

路由懒加载

当打包构建应用时,javascript包会变得很大,影响页面的加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
结合vue的异步组件和webpack代码分割可以实现

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

function loadView(view) {
  return () => import(/* webpackChunkName: "view-[request]" */ `@/views/${view}.vue`)
}

export default new Router({
  routes: [
    {
      path: '/home',
      name: 'home',
      component: loadView('Home')
    },
    {
      path: '/about',
      name: 'about',
      component: loadView('About')
    }
  ]
})

或者使用webpack特有的require.ensure()

const Baz = r => require.ensure([], ()=>r(require('./Baz.vue')), '/baz')

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

推荐阅读更多精彩内容