码迷,mamicode.com
首页 > 其他好文 > 详细

vue常见面试题

时间:2019-12-20 15:12:30      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:temp   end   UNC   hash   put   执行   path   watch   发布   

谈谈MVVM开发模式的理解

MVVM分为Model、View、ViewModel三者

Model:代表数据类型,数据和业务逻辑都在Model层中定义;
View:代表UI视图,负责数据的展示;
ViewModel:负责监听Model中数据的改变并且控制视图的更新,处理用户交互操作

Model和View并无直接关联,而是通过ViewModel来进行联系的,Model和ViewModel之间有着双向数据绑定的联系。因为当Model中的数据改变时会触发View层的舒心,View中由于用户交互操作而改变的数据也会在Model中同步。

这种模式实现了Model和View的数据自动同步,因为开发中只需要专注对数据的维护操作即可,而不需要自己操作dom

v-if 和 v-show 的区别

v-show仅仅控制元素的显示方式,将display属性在block和none来回切换;
v-if会控制这个dom节点的存在与否
当我们需要经常切换某个元素的显示/隐藏时,使用v-show会更加节省性能上的消耗;当只需要一次显示或隐藏时,使用v-if更加合理

vue中如何在组件内部实现一个双向数据绑定

假设有一个输入框组件,用户输入时,同步父组件页面中的数据
具体做法:父组件通过props传值给子组件,子组件通过 $emit 来通知父组件修改相应的props值

import Vue from 'vue'

const component = {
  props: ['value'],
  template: `
    <div>
      <input type="text" @input="handleInput" :value="value">
    </div>  
  `,
  data() {
    return {

    }
  },
  methods: {
    handleInput(e){
      this.$emit('input', e.target.value)
    }
  }
}

new Vue({
  components: {
    CompOne: component
  },
  el: '#root',
  template: `
    <div>
      <com-one :value1="value" @input="value = argumentr[0]"></com-one>
    </div>
  `,
  data(){
    return {
      value: '123'
    }
  }
})

我们在父组件做了两件事,一是给子组件传入props,二是监听input事件并同步自己的value属性。那么这两步操作可再精简一下,v-model实际上会帮我们完成上面的两个操作.修改父组件:

template:
`
  <div>
      <com-one v-model="value"></com-one>  
    </div>  
`   

vue中如何监控某个属性值的变化

方法一:比如现在需要监控data中,obj.a的变化。vue中监控对象属性的变化可以如下

watch: {
    obj: {
        handler (newValue, oldValue){
            console.log('obj changed')
        },
        deep: true
    }
}

deep属性表示深层遍历,但是这么写会监控obj的所有属性变化,修改:

watch: {
    'obj.a': {
        handler (newValue, oldValue){
            console.log('obj changed')
        }
    }
}

方法二:通过computed来实现

computed: {
    a1() {
        return this.obj.a
    }
}

delete 和 Vue.delete 删除数组的区别

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

如何优化SPA应用的首屏加载速度慢的问题

将公用的JS库通过script标签外部引入,减小app.bundel的大小,让浏览器并行下载资源文件,提高下载速度;
在配置路由时,页面和组件使用懒加载的方式引入,进一步缩小app.bundel的体积,再调用某个组件时再加载对应的js文件
加一个首屏loading图,提升用户体验

Vue的生命周期

beforeCreate(创建前)在数据观测和初始化事件还未开始

created(创建后)完成数据观测,属性和方法的运算,初始化时间,$el 属性还没有显示出来

beforeMount(载入前)在挂载开始之前被调用,相关的render函数首次被调用。实例已完成一下的配置:编译模板,把data里面的数据和模板生成html到页面上。

mounted(载入后)在el被新创建的 vm.$el替换,并挂载到实例上去之后调用。实例已完成以下爱的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。次过程中进行ajax交互

beforeUpdate(更新前)在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前,可以在该钩子中进一步更改状态,不会触发附加的冲渲染过程。

updated(更新后)在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖DOM的操作。然而大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器渲染期间不被调用。

beforeDestroy(销毁前)在实例销毁之前调用。实例仍然完全可用。

destory(销毁后)在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

Vue实现数据双向绑定的原理:Object.defineProperty()

 vue实现数据双向绑定的主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的settrer,gerter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通的 Javascript 对象传给Vue实例来作为它的data选项时,Vue将遍历它的属性,用Object.defineProperty将它们转为getter/setter。用户看不到getter/setter,但是在内部它们让Vue追踪依赖,属性被访问和修改时通知变化。
  vue的数据双向绑定,将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的Model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析{{}}),最终利用watcher搭起Observer和Compile之间的通信桥梁,达到数据变化->视图更新;视频交互变化(input)->数据model变更双向绑定效果。

<div id="app">
  <input type="text" id="txt">
  <p id="show"></p>
</div>

var obj = {}
  Object.defineProperty(obj, 'txt', {
    get: function(){
      return obj
    },
    set: function(newValue){
      document.getElementById('txt').value = newValue
      document.getElementById('show').innerHTML = newValue
    }
  })

  document.addEventListener('keyup', function(e){
    obj.txt = e.target.value
  })

Vue组件间之间传值

父组件与子组件传值
父组件传给子组件:子组件通过props方法接受数据;
子组件传给父组件:$emit方法传递参数
兄弟组件传值
eventBus,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接受事件。项目比较大时,推荐vuex

Vue路由的钩子函数

首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改,一些需要登录才能调整页面的重定向功能

对 keep-alive 的了解

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

css只在当前组件起作用

在style标签中写入 scoped 即可,例如:

$route 和 $router 的区别

$route是“路由信息对象”,包括path,params,hash.query,fullPath.matched,name等路由信息参数。
$router是“路由实例”对象包括了路由的跳转方法,钩子函数

vue.js的两个核心是什么

数据驱动,组件系统

vue中 key 值的作用

当 vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue将不会移动DOM元素来匹配数据项的顺序,而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key 的作用主要是为了高效的更新虚拟DOM

vue常见面试题

标签:temp   end   UNC   hash   put   执行   path   watch   发布   

原文地址:https://www.cnblogs.com/shemingxin/p/12073150.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!