Vue注意要点

1. vue的优点

轻量级
速度快
简单易学
低耦合
可重用性
独立开发
文档齐全,且文档为中文文档

2. vue父子组件传递数据
  • props
    vue中组件的props属性
    让组件接收外部传来的数据
    接收数据三种方式:
    (1)只接收:props: [‘name’,‘age’,‘sex’]
    (2)接收并限制类型:props: { “name”:Number }
    (3)限制类型、限制必要性指定默认值:
    props:{
        "name":{
            type:String,
            required:true
        },
        "age":{
            type:Number,
            default:18
        },
        "sex":{
            type:String,
            default:'男'
        },
    },

注意:props是只读的,vue底层会检测你对props的修改,如果进行了修改,控制台会报错,必须修改,就复制一份到data中,通过data去修改数据。

  • $emit
    子组件可以使用$emit调用父组件的方法并传递数据

子组件:

<template>
  <div>
      <button @click="sendMsgToParent">向父组件传值</button>
  </div>
</template>

<script>
  export default {
    methods: {
      sendMsgToParent:function () {
        this.$emit("childMsg","hello world!");
      }
    }
  }
</script>

父组件:

<template>
  <div id="app">
    //@childMsg 与子组件中this.$emit("childMsg","hello world!")起的名字一致
    <child @childMsg="showChildMsg"></child>
  </div>
</template>

<script>
  import child from './components/Child'
  export default {
    name: "app",
    components: {
      child
    },
    methods:{
      showChildMsg:function (data) {
        console.log(data);
      }
    }
  }
</script>
3. v-show和v-if指令的共同点和不同点
<body>
    <div id="app">
        <div v-if="isIf"><p>我被v-if控制</p></div>
        <div v-show="isShow"><p>我被v-show控制</p></div>
        <button @click="pChange">Change</button>
    </div>
</body>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            isIf:true,
            isShow:true
        },
        methods:{
            pChange(){
                this.isIf=(this.isIf===true?false:true);
                this.isShow=(this.isShow===true?false:true);
            }
        }
    })
</script>
  • 共同点:都是动态显示DOM元素
  • 区别点:
    v-if是动态的向DOM树内添加或者删除DOM元素
    v-show是通过设置DOM元素的display样式属性控制显隐
    v-if 切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件
    v-show只是简单的基于css切换
  • 性能消耗:
    v-if 有更高的切换消耗
    v-show有更高的初始渲染消耗
  • 使用场景:
    v-if 适合运营条件不大可能改变的
    v-show 适合频繁切换的
4. 如何让CSS只在当前组件中起作用

Scoped

5. slot-scope

父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。简单的说,就是父组件中不能直接用子组件中定义的data数据。而slot-scope的出现就是解决了这样的问题。

父组件:

<template lang="">
  <div>
    <h3>这是父组件</h3>
    <son>
      <template slot="myslot" slot-scope="scope">
        <ul>
          <li v-for="item in scope.data">{{item}}</li>
        </ul>
      </template>
    </son>
  </div> 
</template>

子组件:

<template>
  <div>
    <h4>这是子组件</h4>
    <input type="text" placeholder="请输入">
    <slot name="myslot" :data='list'></slot>
  </div>
</template>
 
<script>
  export default {
    name:'Son',
    data(){
      return{
        list:[
          {name:"Tom",age:15},
          {name:"Jim",age:25},
          {name:"Tony",age:13}
        ]
      }
    }
  }
</script>

在这里插入图片描述

6. <keep-alive></keep-alive>的作用是什么

主要用于需要频繁的切换组件时进行缓存,不需要重新渲染页面

7. 如何获取dom

给dom元素加ref=’refname’,然后通过this.$refs.refname获取dom元素

8. 说出几种vue当中的指令和它的用法
  • v-model:表单元素绑定
  • v-on:可简写为 @,当有事件触发时,即方法调用等可使用
  • v-html:内容绑定
  • v-text:内容绑定
  • v-once:只会渲染对应元素一次,数据更新不会引起视图的更新,目的是为了优化页面的性能。
  • v-for:列表循环,根据数据生成列表结构
    v-for="(item, index) in itemList"语句中itemList表示数据列表,item表示列表中的每一项,index表示列表索引 ,从0开始
    v-bind:属性绑定,可简写为 :,可控制属性值的更改,进而改变显示效果
  • v-if、v-show:
    共同点:根据表达式的真假,切换元素的显示或隐藏。 true显示,false隐藏
    不同点:
    v-show:切换的是样式,用于频繁的显示隐藏操作,原理是修改display属性。
    v-if: 切换的是dom树,原理:删除节点
9. vue-loader是什么?它的用途是什么?

Vue文件的一个加载器,将template/js/style转换为js模块
用途:js可以写ES6、style样式

10. 为什么用key

给每个dom元素加上key作为唯一标识,diff算法可以正确的识别这个节点,使页面渲染更加迅速

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

可以,比如v-on=”onclick, onblur”

12. $nextTick的使用

在data()中修改值后,页面无法获取data修改后的数据,使用$nextTick时,当data中的数据修改后,可以实时渲染页面

13. Vue组件中data为什么必须是一个函数?

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

14. vue的双向数据绑定是如何实现的?

Vue双向数据绑定是通过数据劫持、组合、发布订阅模式的方式来实现的,也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变。
核心:关于vue双向数据绑定,其核心是Object.defineProperty()方法

15. 单页面应用和多页面应用区别及缺点

单页面应用(SPA),通俗的说就是指只有一个主页面的应用,浏览器一开始就加载所有的js、html、css。所有的页面内容都包含在这个主页面中,但在写的时候,还是分开写,然后在加护的时候有路由程序动态载入,单页面的页面跳转,仅刷新局部资源。多用于PC端。
多页面(MPA):就是一个应用中有多个页面,页面跳转时是整页刷新
单页面的优点:用户体验好,快,内容的改变不需要重新加载整个页面,基于这一点spa对服务器压力较小;前后端分离,页面效果比较酷炫
单页面的缺点:不利于SEO,导航不可用,如果一定要导航需要自行实现前进、后退。初次加载时耗时多;页面复杂度提高很多。

16. Vue项目中为什么要在列表组件中写 key,其作用是什么?
  • Key是给每一个 vnode的唯一ID,可以依靠key,更准确,更快的拿到oldVnode中对应的vnode节点。
  • 更准确
    因为带key就不是就地复用了,在sameNode函数a.key === b.key对比中可以避免就地复用的情况,所以会更加准确。
  • 更快
    利用key的唯一性生成map对象来获取对应节点,比遍历方式更快。
17. 父组件和子组件生命周期钩子函数执行顺序是什么 ?

加载渲染过程
父 beforeCreate -> 父created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount ->子 mounted -> 父 mounted

子组件更新过程
父 beforeUpdate -> 子 beforeUpdate ->子 updated -> 父 updated

父组件更新过程
父 beforeUpdate -> 父 updated

销毁过程
父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed

18. 谈一谈你对nextTick的理解?

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

19. vue更新数组时触发视图更新的方法

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

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

每个 Vue实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到DOM并在数据变化时更新DOM等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给用户在不同阶段添加自己的代码的机会。

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

beforeCreate, created, beforeMount, mounted

22. vue获取数据一般在哪个周期函数?

created
beforeMount
mounted

23. created和mounted的 区别

created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。

24. vue生命周期的理解

点击查看详情
在这里插入图片描述

  • 总共分为8个阶段:创建前/后、载入前/后、更新前/后、销毁前/后
  • 创建前/后:在beforeCreate阶段,vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。在 created阶段,vue实例的数据对象data有了,$el还没有。
  • 载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的 dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。
  • 更新前/后:当data变化时,会触发beforeUpdate和upadted方法
  • 销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。
25. Vuex是什么?Vuex有哪几种属性?

Vuex是vue框架中的状态管理
有五种:State, Getter, Mutation, Action, Module
State:基本数据(数据源存放地)
Getter:从基本数据派生出来的数据
Mutation:提交更改数据的方法,同步!
Action:像一个装饰器,包裹mutation,使之可以异步
Module:模块化Vuex

26. v-for与v-if的优先级

v-for和v-if同时使用,有一个先后运行的优先级,v-for比 v-if优先级更高,这就说明在v-for每次的循环中每一次调用v-if的判断,所以不推荐v-if和v-for在同一个标签中同时使用

27. vue事件中如何使用event对象?

获取事件对象,方法参数传递$event,注意在事件中要使用符号$

<button @click = "Event($event)">事件对象</button>
28. 组件传值方式有哪些?
  • 父传子:子组件通过props['xx']来接收父组件传递的属性xx的值
  • 子传父:子组件通过this.$emit('fnName', value)来传递,父组件通过接收fnName事件方法来接收回调
  • 其他方式:通过创建一个bus,进行传递
  • 使用Vuex
29. vue中子组件调用父组件的方法?

直接在子组件中通过this.$parent.event来调用父组件的方法。
在子组件里用$emit()向父组件触发一个事件,父组件监听这个事件就行了。
父组件把方法传入子组件,在子组件里直接调用这个方法。

30. vue路由声明式导航router-link跳转

不带参数:
注意:router-link中连接如果是‘/’开始就是从根路由开始,如果开始不带‘/’,则从当前路由开始。

<router-link :to="{name:'home'}">
<router-link :to="{path:'/home'}"> // name, path都行,建议用name

带参数:

<router-link :to="{name:'home', param: {id: 1}}">
<router-link :to="{path:'/home', query: {id: 1}}">
<router-link :to="/home/:id">

传递 对象

<router-link :to="{name:'detail', query: {item:JSON.stringify(obj)}}"></router-link>
31. Computed和Watched的区别

computed计算属性:依赖其他属性值,并且computed的值有缓存,只有它依赖的属性值发生改变,下一次获取computed的值时才会重新计算computed的值。
watch侦听器:更多的是观察的作用,无缓存性,类似于某些数据的监听回调,每当监听的数据变化时都会执行回调进行后续操作。
运用场景:
当我们需要进行数据计算,并且依赖于其他数据时,应该使用computed的缓存特性,避免每次获取值时,都要重新计算。
当我们需要在数据变化时执行异步或开销较大的操作时,应该使用watch,使用watch选项允许我们执行异步操作(访问一个API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态,这些都是集散属性无法做到的。
多个因素影响一个显示,用computed;一个因素的变化影响多个其他因素、显示,用watch。
Computed和Methods的区别:
computed:计算属性是基于它 们的依赖进行缓存的,只有在它的相关依赖发生改变时才重新求值,对于method,只要发生重新渲染 。
method:调用总是会执行该函数

32. 如何解决数据层级结构太深的问题

在开发业务时,经常会出现异步获取数据的情况,有时数据层次比较深,如以下代码 :<span v-text="a.b.c.d">,可以使用vm.$set手动定义一层数据:vm.$set("demo", a.b.c.d)

33. vue常用指令

v-model 用用于表单元素实现双向数据绑定(用angular中的ng-model)
v-bind 动态绑定 作用:及时对页面的数据进行更改
v-on:click 给标签绑定函数,可以缩写为@,例如绑定一个点击函数,函数必须写在methods里面
v-for 格式: v-for=“字段名 in(of) 数组json” 循环数组或json(同angular中的ng-repeat)
v-show 显示内容 (同 angular中的ng-show)
v-hide 隐藏内容 (同 angular中的ng-hide)
v-if 显示与隐藏 (dom元素的删除添加 同angular中的ng-if 默认值为false)
v-else-if 必须和v-if连用
v-else 必须和v-if连用 不能单独使用 否则报错 模板编译错误
v-text 解析文本
v-html 解析html标签
v-bind:class 三种绑定方法
对象型:'{red:isred}'
三元型:'isred?"red":blue'
数组型:'[{red:"isred"}, {blue:"isblue"}]'
v-once 进入页面时,只渲染一次,不再进行渲染
v-cloak 防止闪烁
v-pre 把标签内部的元素原位输出

34. $route和$router的区别

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

35. 怎么理解Vue的单项数据流
  • 数据总是从父组件传到子组件,子组件没有权利修改父组件传过来的数据,只能请求父组件对原始数据进行修改,这样会防止从子组件意外改变父组件的状态,从而导致你的应用的数据流向难以理解。
  • 注意:在子组件直接用v-model绑定父组件传过来的props这样是不规范的写法,开发环境会报警告。
    如果实在要改变父组件的props值可以在data里面定义一个变量,并用prop的值初始化它,之后用$emit通知父组件去修改。
36. Vuex页面刷新数据丢失怎么解决?
  • 需要使用vuex数据持久化,一般使用本地储存的方案来保存数据,可以自己设计存储方案,也可以使用第三方插件 。
  • 推荐使用vuex-persist插件,它是为Vuex持久化储存而生的一个插件,不需要你手动存取storage,而是直接将状态保存至cookie或者localStorage中。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值