vue相关

vue面试题

一、vue优点

1.轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十kb;

2.简单易学:国人开发,中文文档,不存在语言障碍 ,易于理解和学习;

3.双向数据绑定:保留了angular的特点,在数据操作方面更为简单;

4.组件化:保留了react的优点,实现了html的封装和重用,在构建单页面应用方面有着独特的优势;视图,数据,结构分离:使数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作;

5.虚拟DOM:dom操作是非常耗费性能的, 不再使用原生的dom操作节点,极大解放dom操作,但具体操作的还是dom不过是换了另一种方式;

6.运行速度更快:相比较与react而言,同样是操作虚拟dom,就性能而言,vue存在很大的优势。


二、vue中的父子组件之间的数据传递之props、$ref和$emit

props是用于数据之间的传递(父组件向子组件),ref也可以用于数据之间的传递(ref用在子组件上,指向的是组件实例,可以理解为对子组件的索引,通过ref可能获取到在子组件里定义的属性和方法。),$emit是用于事件之间的传递(子组件触发父组件里面的方法)

1.props是用于父组件向子组件传递数据信息(所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。)

这里有两种常见的试图变更一个 prop 的情形:

A.这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:

props: ['initialCounter'],

data:function(){return{counter:this.initialCounter  }}

B.这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

props: ['size'],

computed: {normalizedSize:function(){returnthis.size.trim().toLowerCase()  }}

注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。

2.通过ref 实现通信

对于ref官方的解释是:ref 是被用来给元素或子组件注册引用信息的。引用信息将会注册在父组件的 refs 对象上。

那应该怎么理解?看看下面的解释:

(1).如果ref用在子组件上,指向的是组件实例,可以理解为对子组件的索引,通过ref可能获取到在子组件里定义的属性和方法。

(2).如果ref在普通的 DOM 元素上使用,引用指向的就是 DOM 元素,通过$ref可能获取到该DOM 的属性集合,轻松访问到DOM元素,作用与JQ选择器类似。

prop和$ref之间的区别:

1.prop 着重于数据的传递,它并不能调用子组件里的属性和方法。像创建文章组件时,自定义标题和内容这样的使用场景,最适合使用prop。

2.ref 着重于索引,主要用来调用子组件里的属性和方法,其实并不擅长数据传递。而且ref用在dom元素的时候,能使到选择器的作用,这个功能比作为索引更常有用到。

3.通过emit 实现通信

上面两种示例主要都是父组件向子组件通信,而通过emit实现子组件向父组件通信。对于emit实现子组件向父组件通信。

vm.$emit( event, […arg] )  $emit是可以传递多个参数的

$emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数。


三、v-show和v-if指令的共同点和不同点?

共同点:都能控制元素的显示和隐藏;

不同点:实现本质方法不同,v-show本质就是通过控制css中的display设置为none,控制隐藏,只会编译一次;v-if是动态的向DOM树内添加或者删除DOM元素,若初始值为false,就不会编译了。而且v-if不停的销毁和创建比较消耗性能。

总结:如果要频繁切换某节点,使用v-show(切换开销比较小,初始开销较大)。如果不需要频繁切换某节点使用v-if(初始渲染开销较小,切换开销比较大)。


四、如何让CSS只在当前组件中起作用?

在组件中的style前面加上scoped


五、<keep-alive></keep-alive>

1.keep-alive简介:keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

用法也很简单:

<keep-alive>

  <component>

    <!-- 该组件将被缓存! -->

  </component>

</keep-alive>

2.props

include - 字符串或正则表达,只有匹配的组件会被缓存

// 组件 a

export default {

  name: 'a',

  data () {

    return {}

  }

}

<keep-alive include="a">//可以保留它的状态或避免重新渲染

  <component>

    <!-- name 为 a 的组件将被缓存! -->

  </component>

</keep-alive>//可以保留它的状态或避免重新渲染

exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存

<keep-alive exclude="a">

  <component>

    <!-- 除了 name 为 a 的组件都将被缓存! -->

  </component>

</keep-alive>//可以保留它的状态或避免重新渲染

问题:如果只想router-view里面某个组件被缓存,怎么办?

1.使用 include/exclude

2.增加 router.meta 属性

// 组件 a

export default{name:'a',data(){return{}}}

缺点:需要知道组件的 name,项目复杂的时候不是很好的选择

优点:不需要例举出需要被缓存组件名称

增加 router.meta 属性

// routes 配置

export default [{path:'/:id',name:'edit',component:Edit,meta:{keepAlive:false// 不需要被缓存}}]

  {

    path: '/',

    name: 'home',

    component: Home,

    meta: {

      keepAlive: true // 需要被缓存

    }

  }, {

    path: '/:id',

    name: 'edit',

    component: Edit,

    meta: {

      keepAlive: false // 不需要被缓存

    }

  }

]

<keep-alive>

    <router-view v-if="$route.meta.keepAlive">

        <!-- 这里是会被缓存的视图组件,比如 Home! -->

    </router-view>

</keep-alive>

<router-view v-if="!$route.meta.keepAlive">

    <!-- 这里是不被缓存的视图组件,比如 Edit! -->

</router-view>

vue实现前进刷新,后退不刷新:https://juejin.im/post/5a69894a518825733b0f12f2

参考文章:https://www.jianshu.com/p/0b0222954483


六、如何获取dom?

答:ref="domName" 用法:this.$refs.domName


七、说出几种vue当中的指令和它的用法?

v-model双向数据绑定;

v-for循环;

v-if v-show 显示与隐藏;

v-on事件;v-once: 只绑定一次。


八、vue-loader是什么?使用它的用途有哪些?

Vue Loader 是一个webpack的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件

Vue Loader 还提供了很多酷炫的特性:

1.允许为 Vue 组件的每个部分使用其它的 webpack loader,例如在<style>的部分使用 Sass 和在<template>的部分使用 Pug;

2.允许在一个.vue文件中使用自定义块,并对其运用自定义的 loader 链;

3.使用 webpack loader 将<style>和<template>中引用的资源当作模块依赖来处理;

4.为每个组件模拟出 scoped CSS;

5.在开发过程中使用热重载来保持状态。

用途:js可以写es6、style样式可以scss或less、template可以加jade等


九、v-for 为什么使用key?

需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点。作用主要是为了高效的更新虚拟DOM。


十、axios

1.axios 简介

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:

1.从浏览器中创建 XMLHttpRequest

2.从 node.js 发出 http 请求

3.支持 Promise API

4.拦截请求和响应

5.转换请求和响应数据

6.取消请求

7.自动转换JSON数据

8.客户端支持防止 CSRF/XSRF

axios中的发送字段的参数是data跟params两个,两者的区别在于params是跟请求地址一起发送的,data的作为一个请求体进行发送,params一般适用于get请求,data一般适用于post put 请求。

安装

npm安装 $ npm install axios --save

通过cdn引入 <scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>

发送GET请求

// created:vue生命周期中的钩子函数,在这个时间点,data中的数据已经注入到响应式系统中

created(){

    axios.get('api/getData.php',{       // 还可以直接把参数拼接在url后边

        params:{

            title:'眼镜'

        }

    }).then(function(res){

        this.goodsList = res.data;

    }).catch(function (error) {

        console.log(error);

    });

}

发送POST请求

axios.post('/user', {

    firstName: 'Fred',

    lastName: 'Flintstone'

}).then(function (response) {

    console.log(response);

}).catch(function (error) {

    console.log(error);

});

执行多个并发请求

//获得用户信息的请求

function getUserAccount() {

     return axios.get('/user/12345');

}

//获取用户许可证的请求

function getUserPermissions() {

     return axios.get('/user/12345/permissions');

}

axios.all( [ getUserAccount(),  getUserPermissions() ] )

    .then(axios.spread(function (acct, perms) {

        //两个请求现已完成

    })

);

请求拦截器和响应拦截器

//请求拦截器

axios.interceptors.request.use(

  function (config) {

      // 在发送请求之前做些什么

      return config;

  },

  function (error) {

      // 对请求错误做些什么

      return Promise.reject(error);

  }

);

//响应拦截器

axios.interceptors.response.use(

  function (config) {

      // 对响应数据做点什么

      return config;

  },

  function (error) {

      // 对响应错误做点什么

      return Promise.reject(error);

  }

);

Vue中axios在发送POST请求时,参数的处理

1. 下载安装第三方模块 qs ->  npm install qs --save-dev

2. 处理方式

// 第一种: 直接在发送的时候,对数据进行qs.stringify处理

// 缺点: 如果项目大,有大量的请求需要发送,那么一个一个加会很麻烦

axios.post("/checkLogin.php", qs.stringify({

  name, pwd

}));

// 第二种: 使用axios.create创建一个新的axios实例,统一对数据进行处理, 同时也要借助qs模块

const Axios = axios.create({

  baseURL: '/api',

  transformRequest: [function (data) {

    const d = qs.stringify(data)

    return d;

  }]

})

Axios.post("/checkLogin.php", {

  name, pwd

});


十一、v-modal的使用

v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作:

1.v-bind绑定一个value属性;

2.v-on指令给当前元素绑定input事件。


十二、请说出vue.cli项目中src目录每个文件夹和文件的用法?

assets文件夹是放静态资源;components是放组件;router是定义路由相关的配置; app.vue是一个应用主组件;main.js是入口文件。


十三、分别简述computed和watch的区别和使用场景

1.区别

watch中的函数是不需要调用的

computed内部的函数调用的时候不需要加()

watch  属性监听 监听属性的变化

computed:计算属性通过属性计算而得来的属性

watch需要在数据变化时执行异步或开销较大的操作时使用

对于任何复杂逻辑或一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使用计算属性computed。

computed 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用;

computed中的函数必须用return返回最终的结果

当computed中的函数所依赖的属性如果没有发生改变的时候,那么调用当前函数的时候结果会从缓存中读取

watch 一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;

2.使用场景

computed:当一个属性受多个属性影响的时候就需要用到computed

例子: 购物车商品结算的时候

watch:当一条数据影响多条数据的时候就需要用watch

例子:搜索数据


十四、v-on可以监听多个方法吗?

可以,栗子:<input  type="text"  v-on="{ input:onInput,focus:onFocus,blur:onBlur, }">。


十五、$nextTick的使用

当你修改了data的值然后马上获取这个dom元素的值,是不能获取到更新后的值,你需要使用$nextTick这个回调,让修改后的data值渲染更新到dom元素之后在获取,才能成功。

在下次 DOM 更新循环结束之后执行延迟回调。nextTick主要使用了宏任务和微任务。根据执行环境分别尝试采用

Promise

MutationObserver

setImmediate

如果以上都不行则采用setTimeout

定义了一个异步方法,多次调用nextTick会将方法存入队列中,通过这个异步方法清空当前队列。


十六、vue组件中data为什么必须是一个函数?

因为JavaScript的特性所导致,在component中,data必须以函数的形式存在,不可以是对象。组件中的data写成一个函数,数据以函数返回值的形式定义,这样每次复用组件的时候,都会返回一份新的data,相当于每个组件实例都有自己私有的数据空间,它们只负责各自维护的数据,不会造成混乱。而单纯的写成对象形式,就是所有的组件实例共用了一个data,这样改一个全都改了。


十七、渐进式框架的理解

主张最少;可以根据不同的需求选择不同的层级;


十八、Vue中双向数据绑定是如何实现的?

vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

详细请参考:  http://www.cnblogs.com/libin-1/p/6893712.html

具体步骤:

第一步:需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上setter和getter

这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化

第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图

第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:

1、在自身实例化时往属性订阅器(dep)里面添加自己

2、自身必须有一个update()方法

3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。

第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果。

核心:关于VUE双向数据绑定,其核心是 Object.defineProperty()方法。


十九、单页面应用和多页面应用区别及优缺点

单页面应用(SPA),通俗一点说就是指只有一个主页面的应用,浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。但在写的时候,还是会分开写(页面片段),然后在交互的时候由路由程序动态载入,单页面的页面跳转,仅刷新局部资源。多应用于pc端。

多页面(MPA),就是指一个应用中有多个页面,页面跳转时是整页刷新

单页面的优点:

用户体验好,快,内容的改变不需要重新加载整个页面,基于这一点spa对服务器压力较小;前后端分离;页面效果会比较炫酷(比如切换页面内容时的专场动画)。

单页面缺点:

不利于seo;导航不可用,如果一定要导航需要自行实现前进、后退。(由于是单页面不能用浏览器的前进后退功能,所以需要自己建立堆栈管理);初次加载时耗时多;页面复杂度提高很多。


二十、v-if和v-for的优先级

当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级,这意味着 v-if 将分别重复运行于每个 v-for 循环中。所以,不推荐v-if和v-for同时使用。

如果v-if和v-for一起用的话,vue中的的会自动提示v-if应该放到外层去。


二十一、assets和static的区别

答相同点:assets和static两个都是存放静态资源文件。项目中所需要的资源文件图片,字体图标,样式文件等都可以放在这两个文件下,这是相同点

不相同点:assets中存放的静态资源文件在项目打包时,也就是运行npm run build时会将assets中放置的静态资源文件进行打包上传,所谓打包简单点可以理解为压缩体积,代码格式化。而压缩后的静态资源文件最终也都会放置在static文件中跟着index.html一同上传至服务器。static中放置的静态资源文件就不会要走打包压缩格式化等流程,而是直接进入打包好的目录,直接上传至服务器。因为避免了压缩直接进行上传,在打包时会提高一定的效率,但是static中的资源文件由于没有进行压缩等操作,所以文件的体积也就相对于assets中打包后的文件提交较大点。在服务器中就会占据更大的空间。

建议:将项目中template需要的样式文件js文件等都可以放置在assets中,走打包这一流程。减少体积。而项目中引入的第三方的资源文件如iconfoont.css等文件可以放置在static中,因为这些引入的第三方文件已经经过处理,我们不再需要处理,直接上传。


二十二、vue常用的修饰符

.stop:等同于JavaScript中的event.stopPropagation(),防止事件冒泡;

.prevent:等同于JavaScript中的event.preventDefault(),防止执行预设的行为(如果事件可取消,则取消该事件,而不停止事件的进一步传播);

.capture:与事件冒泡的方向相反,事件捕获由外到内;

.self:只会触发自己范围内的事件,不包含子元素;

.once:只会触发一次。


二十三、vue的两个核心点

数据驱动、组件系统

1.数据驱动:ViewModel,保证数据和视图的一致性。

2.组件系统:应用类UI可以看作全部是由组件树构成的。


二十四、vue和jQuery的区别

jQuery是使用选择器($)选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。比如需要获取label标签的内容:$("lable").val();,它还是依赖DOM元素的值。

Vue则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,他们通过Vue对象这个vm实现相互的绑定。这就是传说中的MVVM。


二十五、引进组件的步骤

在template中引入组件;

在script的第一行用import引入路径;

用component中写上组件名称。


二十六、delete和Vue.delete删除数组的区别

delete只是被删除的元素变成了 empty/undefined 其他的元素的键值还是不变。Vue.delete 直接删除了数组 改变了数组的键值。


二十七、SPA首屏加载慢如何解决

1、尽可能的缩小webpack或者其他打包工具生成的包的大小

2、使用服务端渲染的方式

3、使用预渲染的方式

4、使用gzip减小网络传输的流量大小

5、按照页面或者组件分块懒加载

6、异步路由加载


二十八、Vue-router跳转和location.href有什么区别

使用location.href='/url'来跳转,简单方便,但是刷新了页面;

使用history.pushState('/url'),无刷新页面,静态跳转;

引进router,然后使用router.push('/url')来跳转,使用了diff算法,实现了按需加载,减少了dom的消耗。

其实使用router跳转和使用history.pushState()没什么差别的,因为vue-router就是用了history.pushState(),尤其是在history模式下。


二十九、vue slot

简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示、不显示、在哪个地方显示、如何显示,就是slot分发负责的活。


三十、你们vue项目是打包了一个js文件,一个css文件,还是有多个文件?

根据vue-cli脚手架规范,一个js文件,一个CSS文件。


三十一、Vue里面router-link在电脑上有用,在安卓上没反应怎么解决?

Vue路由在Android机上有问题,babel问题,安装babel polypill插件解决。


三十三、Vue2中注册在router-link上事件无效解决方法

使用@click.native。原因:router-link会阻止click事件,.native指直接监听一个原生事件。


三十四、RouterLink在IE和Firefox中不起作用(路由不跳转)的问题

方法一:只用a标签,不适用button标签;方法二:使用button标签和Router.navigate方法


三十五、请说下封装 vue 组件的过程?

1. 建立组件的模板,先把架子搭起来,写写样式,考虑好组件的基本逻辑。

2.  准备好组件的数据输入。即分析好逻辑,定好 props 里面的数据、类型。

3.  准备好组件的数据输出。即根据组件逻辑,做好要暴露出来的方法。

4.  封装完毕了,直接调用即可


三十六、params和query的区别

用法:query要用path来引入,params要用name来引入,接收参数都是类似的,分别是this.$route.query.name和this.$route.params.name。

url地址显示:query更加类似于我们ajax中get传参,params则类似于post,说的再简单一点,前者在浏览器地址栏中显示参数,后者则不显示

注意点:query刷新不会丢失query里面的数据

params刷新 会 丢失 params里面的数据。


三十七、vue初始化页面闪动问题

使用vue开发时,在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然一般情况下这个时间很短暂,但是我们还是有必要让解决这个问题的。

首先:在css里加上[v-cloak] {

display: none;

}。

如果没有彻底解决问题,则在根元素加上style="display: none;" :style="{display: 'block'}"


三十八、vue更新数组时触发视图更新的方法

push();pop();shift();unshift();splice(); sort();reverse()


三九、vue常用的UI组件库

Mint UI,element,VUX


四十、vue修改打包后静态资源路径的修改

cli2版本:将 config/index.js 里的 assetsPublicPath 的值改为 './' 。

build: {

...

assetsPublicPath: './',

...

}

cli3版本:在根目录下新建vue.config.js 文件,然后加上以下内容:(如果已经有此文件就直接修改)

module.exports = {

publicPath: '', // 相对于 HTML 页面(目录相同)      }


四十一、vue.cli中怎样使用自定义的组件?有遇到过哪些问题吗?

第一步:在components目录新建你的组件文件(smithButton.vue),script一定要export default {

第二步:在需要用的页面(组件)中导入:import smithButton from ‘../components/smithButton.vue’

第三步:注入到vue的子组件的components属性上面,components:{smithButton}

第四步:在template视图view中使用,  问题有:smithButton命名,使用的时候则smith-button。


四十二、聊聊你对Vue.js的template编译的理解?

简而言之,就是先转化成AST树,再得到的render函数返回VNode(Vue的虚拟DOM节点)

详情步骤:

首先,通过compile编译器把template编译成AST语法树(abstract

syntax tree

即源代码的抽象语法结构的树状表现形式),compile是createCompiler的返回值,createCompiler是用以创建编译器的。另外compile还负责合并option。

然后,AST会经过generate(将AST语法树转化成render funtion字符串的过程)得到render函数,render的返回值是VNode,VNode是Vue的虚拟DOM节点,里面有(标签名、子节点、文本等等)


四十三、vuejs与angularjs以及react的区别?

1.与AngularJS的区别

相同点:

都支持指令:内置指令和自定义指令。

都支持过滤器:内置过滤器和自定义过滤器。

都支持双向数据绑定。

都不支持低端浏览器。

不同点:

1.AngularJS的学习成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比较简单、直观。

2.在性能上,AngularJS依赖对数据做脏检查,所以Watcher越多越慢。

Vue.js使用基于依赖追踪的观察并且使用异步队列更新。所有的数据都是独立触发的。

对于庞大的应用来说,这个优化差异还是比较明显的。

2.与React的区别

相同点:

React采用特殊的JSX语法,Vue.js在组件开发中也推崇编写.vue特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用。

中心思想相同:一切都是组件,组件实例之间可以嵌套。

都提供合理的钩子函数,可以让开发者定制化地去处理需求。

都不内置列数AJAX,Route等功能到核心包,而是以插件的方式加载。

在组件开发中都支持mixins的特性。

不同点:

React依赖Virtual DOM,而Vue.js使用的是DOM模板。React采用的Virtual DOM会对渲染出来的结果做脏检查。

Vue.js在模板中提供了指令,过滤器等,可以非常方便,快捷地操作Virtual DOM。


四十四、虚拟Dom以及key属性的作用

由于在浏览器中操作DOM是很昂贵的。频繁的操作DOM,会产生一定的性能问题。这就是虚拟Dom的产生原因。

Vue2的Virtual

DOM借鉴了开源库snabbdom的实现。Virtual

DOM本质就是用一个原生的JS对象去描述一个DOM节点。是对真实DOM的一层抽象。(也就是源码中的VNode类,它定义在src/core/vdom/vnode.js中。)VirtualDOM映射到真实DOM要经历VNode的create、diff、patch等阶段。

「key的作用是尽可能的复用 DOM 元素。」

新旧

children 中的节点只有顺序是不同的时候,最佳的操作应该是通过移动元素的位置来达到更新的目的。需要在新旧 children

的节点中保存映射关系,以便能够在旧 children 的节点中找到可复用的节点。key也就是children中节点的唯一标识。


四十五、 请说出 vue-cli 工程中每个文件夹和文件的用处。

build 文件夹:存放 webpack 的相关配置以及脚本文件,在实际开发过程中只会偶尔用到webpack.base.conf.js,配置 less、babel 等。

config 文件夹:常用到此文件夹下的 config.js (index.js) 配置开发环境的端口号,是否开启热加载或者设置生产环境的静态资源相对路径、是否开启 gzip 压缩、npm run build 命令打包生成静态资源的名称和路径等。

node_modules:存放 npm install 命令下载的开发环境和生产环境的各种依赖。

src文件夹 :工程项目的源码以及资源、包括页面图片、路由组件、路由配置、vuex、入口文件等。其他文件:定义的一些项目信息,说明等等。


四十六、vue中解决跨域问题

方法1.后台更改header

header('Access-Control-Allow-Origin:*');//允许所有来源访问

header('Access-Control-Allow-Method:POST,GET');//允许访问的方式

方法2.使用JQuery提供的jsonp

methods: {

  getData () {

    var self = this

    $.ajax({

      url: 'http://f.apiplus.cn/bj11x5.json',

      type: 'GET',

      dataType: 'JSONP',

      success: function (res) {

        self.data = res.data.slice(0, 3)

        self.opencode = res.data[0].opencode.split(',')

      }

    })

  }

}

方法3.使用http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建)

例如请求的url:“http://f.apiplus.cn/bj11x5.json”

1、打开config/index.js,在proxyTable中添写如下代码:

proxyTable: {

  '/api': {  //使用"/api"来代替"http://f.apiplus.c"

    target: 'http://f.apiplus.cn', //源地址

    changeOrigin: true, //改变源

    pathRewrite: {

      '^/api': 'http://f.apiplus.cn' //路径重写

      }

  }

}

2、使用axios请求数据时直接使用“/api”:

getData () {

axios.get('/api/bj11x5.json', function (res) {

   console.log(res)

})

通过这中方法去解决跨域,打包部署时还按这种方法会出问题。解决方法如下:

let serverUrl = '/api/'  //本地调试时

// let serverUrl = 'http://f.apiplus.cn/'  //打包部署上线时

export default {

  dataUrl: serverUrl + 'bj11x5.json'

}



生命周期函数面试题

1.什么是 vue 生命周期?有什么作用?

每个

Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM

等。同时在这个过程中也会运行一些叫做 生命周期钩子

的函数,这给了用户在不同阶段添加自己的代码的机会。(ps:生命周期钩子就是生命周期函数)例如,如果要通过某些插件操作DOM节点,如想在页面渲染完后弹出广告窗,

那我们最早可在mounted 中进行。


2.第一次页面加载会触发哪几个钩子?

beforeCreate, created, beforeMount, mounted


3.简述每个周期具体适合哪些场景

beforeCreate:在new一个vue实例后,只有一些默认的生命周期钩子和默认事件,其他的东西都还没创建。在beforeCreate生命周期执行的时候,data和methods中的数据都还没有初始化。不能在这个阶段使用data中的数据和methods中的方法

create:data 和 methods都已经被初始化好了,如果要调用 methods 中的方法,或者操作 data 中的数据,最早可以在这个阶段中操作

beforeMount:执行到这个钩子的时候,在内存中已经编译好了模板了,但是还没有挂载到页面中,此时,页面还是旧的

mounted:执行到这个钩子的时候,就表示Vue实例已经初始化完成了。此时组件脱离了创建阶段,进入到了运行阶段。 如果我们想要通过插件操作页面上的DOM节点,最早可以在和这个阶段中进行

beforeUpdate:当执行这个钩子时,页面中的显示的数据还是旧的,data中的数据是更新后的, 页面还没有和最新的数据保持同步

updated:页面显示的数据和data中的数据已经保持同步了,都是最新的

beforeDestory:Vue实例从运行阶段进入到了销毁阶段,这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于可用状态。还没有真正被销毁

destroyed:这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于不可用状态。组件已经被销毁了。


4.created和mounted的区别

created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。

mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。


5.vue获取数据在哪个周期函数

一般 created/beforeMount/mounted 皆可.

比如如果你要操作 DOM , 那肯定 mounted 时候才能操作.


6.请详细说下你对vue生命周期的理解?

总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。

创建前/后:在beforeCreated阶段,vue实例的挂载元素$el和**数据对象**data都为undefined,还未初始化。在created阶段,vue实例的数据对象data有了,$el还没有。

载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。

更新前/后:当data变化时,会触发beforeUpdate和updated方法。

销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。



vue路由面试题

1.mvvm 框架是什么?

vue是实现了双向数据绑定的mvvm框架,当视图改变更新模型层,当模型层改变更新视图层。在vue中,使用了双向绑定技术,就是View的变化能实时让Model发生变化,而Model的变化也能实时更新到View。


2.vue-router 是什么?它有哪些组件

vue用来写路由一个插件。router-link、router-view


3.active-class 是哪个组件的属性?

vue-router模块的router-link组件。children数组来定义子路由


4.怎么定义 vue-router 的动态路由? 怎么获取传过来的值?

在router目录下的index.js文件中,对path属性加上/:id。  使用router对象的params.id。


5.vue-router 有哪几种导航钩子?

三种,

第一种:是全局导航钩子:router.beforeEach(to,from,next),作用:跳转前进行判断拦截。

第二种:组件内的钩子

第三种:单独路由独享组件


6.$route 和 $router 的区别

$router是“路由实例”对象,即使用 new VueRouter创建的实例,包括了路由的跳转方法,钩子函数等。在script标签中想要导航到不同的URL,使用$router.push方法。返回上一个历史history用$router.to(-1)

$route为当前router跳转对象。里面可以获取当前路由的name,path,query,parmas等。


7.vue-router的两种模式

hash模式:即地址栏 URL 中的 # 符号;

history模式:window.history对象打印出来可以看到里边提供的方法和记录长度。利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)。


8.vue-router实现路由懒加载( 动态加载路由 )

三种方式,

第一种:vue异步组件技术 ==== 异步加载,vue-router配置路由 , 使用vue的异步组件技术 , 可以实现按需加载 .但是,这种情况下一个组件生成一个js文件。

第二种:路由懒加载(使用import)。

第三种:webpack提供的require.ensure(),vue-router配置路由,使用webpack的require.ensure技术,也可以实现按需加载。这种情况下,多个路由指定相同的chunkName,会合并打包成一个js文件。



vuex常见面试题

1.vuex是什么?怎么使用?哪种功能场景使用它?

vue框架中状态管理。在main.js引入store,注入。

新建了一个目录store.js,….. export 。

场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车


2.vuex有哪几种属性?

有五种,分别是 State、 Getter、Mutation 、Action、 Module

state=> 基本数据(数据源存放地)

getters=> 从基本数据派生出来的数据

mutations=> 提交更改数据的方法,同步!

actions=> 像一个装饰器,包裹mutations,使之可以异步。

modules=> 模块化Vuex


3.Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中?

如果请求来的数据是不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入vuex 的state里。

如果被其他地方复用,这个很大几率上是需要的,如果需要,请将请求放入action里,方便复用。

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