vue基础题

作者: lucky婧 | 来源:发表于2021-04-28 16:46 被阅读0次

    1.vue组件引用方式,插件引用方式

    2.vue为什么在v-for中的键不推荐使用随机数或者索引呢?那要怎么使用才比较好呢?
    key的作用主要是为了高效地更新虚拟DOM,使用key来给每一个例程做一个唯一的标识;差异算法可以正确的识别此后的解码器,找到正确的位置进行异步进行操作;
    在绑定键的时候,最好是一个唯一的值,如item.id而不能是简单的index;在插入数据或删除数据的时候,会导致后面的数据的键绑定的索引变化,长靴导致重新渲染,效率会降低;
    3.怎么给vue定义全局的方法?
    第一种:挂载到Vue的prototype上。把全局方法写到一个文件里面,然后for循环挂载到Vue的prototype上,缺点是调用这个方法的时候没有提示

    Object.keys(tools).forEach(key => {
       Vue.prototype[key] = tools[key]
    })
    

    第二种:利用全局混入mixin,因为mixin里面的methods会和创建的每个单文件组件合并。这样做的优点是调用这个方法的时候有提示

    Vue.mixin(mixin)
    new Vue({
        store,
        router,
        render: h => h(App),
    }).$mount('#app')
    
    import tools from "./tools"
    import filters from "./filters"
    import Config from '../config'
    import CONSTANT from './const_var'
    
    export default {
        data() {
            return {
                CONFIG: Config,
                CONSTANT: CONSTANT
            }
        },
        methods: {
            // //将tools里面的方法挂载到vue上,以方便调用,直接this.$xxx方法名就可以了
            // Object.keys(tools).forEach(key => {
            //     Vue.prototype[key] = tools[key]
            // })
            //将tools里面的方法用对象展开符混入到mixin上,以方便调用,直接this.$xxx方法名就可以了
            ...tools
        },
        filters: {
            // //将filter里面的方法添加了vue的筛选器上
            // Object.keys(filters).forEach(key => {
            //     Vue.filter(key, filters[key])
            // })
            ...filters
        }
    }
    

    4.跟keep-alive有关的生命周期是哪些?描述下这些生命周期 ?
    1.activated: 页面第一次进入的时候,钩子触发的顺序是created->mounted->activated
    2.deactivated: 页面退出的时候会触发deactivated,当再次前进或者后退的时候只触发activated
    5.v-once的使用场景有什么?
    v-once只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子例程将被视为静态内容并跳过。这可以用于优化更新性能。
    单次触发的场景 :表单提交。可防止用户在请求未及时响应时,多次提交〜
    6.怎么访问到子组件的实例或子元素?

    this.$children / this.$refs.xxx
    

    7.vue组件里的定时器要怎么销毁?

    const timer = setInterval(() =>{
    // 某些定时器操作
    }, 500);
    // 通过$once来监听定时器,在beforeDestroy钩子可以被清除。
    this.$once('hook:beforeDestroy', () => {
    clearInterval(timer);
    })
    

    8.vue组件会在什么时候下被销毁?
    页面关闭,路由重定向,v-if和更改键值
    9.组件中写name选项有什么作用?
    项目使用keep-alive时,可搭配组件name进行缓存过滤
    DOM做递归组件时需要调用自身name
    vue-devtools调试工具里显示的组见名称是由vue中组件name决定的
    10.prop验证的type类型有哪几种?
    type 可以是下列原生构造函数中的一个:
    8种:字符串,数字,布尔值,数组,对象,日期,函数,符号,自定义构造函数
    String、Number、Boolean、Array、Object、Date、Function、Symbol
    11.prop是怎么做验证的?可以设置默认值吗?
    单个类型就用Number等基础类型,多个类型用数组,必填的话设置require为true,默认值的话设置default,对象和数组设置默认用工厂函数,自定义验证函数validator。
    12.说说你对单向数据流和双向数据流的理解
    单向数据流:所有状态的改变可记录,可跟踪,源头易转换;所有数据只有一个,组件数据只有唯一的入口和出口,从而使程序更直观更容易理解,有利于应用的可维护性;一旦数据变化,就去更新页面(data-页面),但是没有(页面-data);如果用户在页面上做了变动,那么就手动收集起来(双向是自动),合并到内置的数据中。
    双向数据流:无论数据改变,或是用户操作,都能带来互相的移位,自动更新。
    模仿就是:父传子的props就是单向数据流,v-model就是双向数据流
    13.写出你知道的表单修饰符和事件修饰符
    事件修饰符.stop .prevent .capture .self .once .passive
    表单修饰符.number .lazy .trim

    // 表单修饰符
    .lazy - 我们输入完所有东西,光标离开才更新视图
    .trim - 过滤首尾空格
    .number - 自动将用户的输入值转为数值类型,如果你先输入数字,那它就会限制你输入的只能是数字。如果你先输入字符串,那它就相当于没有加.number
    
    // 事件修饰符 (尽管我们可以在方法中轻松实现相关处理,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。)
    .stop - 调用 event.stopPropagation(), 阻止事件冒泡(不触发父级事件)。
    .prevent - 调用 event.preventDefault(), 阻止默认行为,比如点击链接会进行跳转;填写表单时按回车会自动提交到服务器;点击鼠标右键会呼出浏览器右键菜单。
    .capture - 添加事件侦听器时使用 capture 模式。事件触发从包含这个元素的顶层开始往下触发,即内部元素触发的事件先在此处理,然后才交由内部元素进行处理。完整的事件机制是:捕获阶段--目标阶段--冒泡阶段
    .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
    .native - 监听组件根元素的原生事件。把一个vue组件转化为一个普通的HTML标签。
    .once - 只触发一次回调。
    .passive - { passive: true } 模式添加侦听器。当我们在监听元素滚动事件的时候,会一直触发onscroll事件,在pc端是没啥问题的,但是在移动端,会让我们的网页变卡,因此我们使用这个修饰符的时候,相当于给onscroll事件整了一个.lazy修饰符。
    
    // 鼠标按键修饰符
    .left - (2.2.0) 只当点击鼠标左键时触发。
    .right - (2.2.0) 只当点击鼠标右键时触发。
    .middle - (2.2.0) 只当点击鼠标中键时触发。
    
    // 键值修饰符
    .keyCode - 只当事件是从特定键触发时才触发回调。
    .exact - 只需要或者只能按一个系统修饰键来触发。
    
    // 其他修饰符
    .sync - 父子组件进行双向数据绑定,会扩展成一个更新父组件绑定值的 v-on 侦听器。
    .camel - HTML 特性是不区分大小写的,该修饰符使属性被渲染为驼峰名
    .prop - 作为一个 DOM property 绑定而不是作为 attribute 绑定。(差别在哪里?)
    

    vue怎么获取DOM节点?
    1、document.getElementById("id")
    2、this.$refs.xx
    vue生命周期总共有几个阶段?

        beforeCreate:在 new 一个 vue 实例后,只有一些默认的生命周期钩子和默认事件,其他的东西都还没创建。
        created:data 和 methods 都已经被初始化好了。(如果要调用 methods 中的方法,或者操作 data 中的数据,最早可以在这个阶段中操作)
        beforeMount:在内存中已经编译好了模板了,但是还没有挂载到页面中,此时,页面还是旧的。
        mounted:Vue 实例已经初始化完成了。此时组件脱离了创建阶段,进入到了运行阶段。 (如果我们想要通过插件操作页面上的 DOM 节点,最早可以在和这个阶段中进行)
        beforeUpdate:页面中的显示的数据还是旧的,data 中的数据是更新后的, 页面还没有和最新的数据保持同步。
        updated:页面显示的数据和 data 中的数据已经保持同步了,都是最新的。
        beforeDestroy:Vue 实例从运行阶段进入到了销毁阶段,这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于可用状态。还没有真正被销毁。
        destroyed:这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于不可用状态。组件已经被销毁了。
    

    组件和插件有什么区别?
    组件 (Component) 是用来构成你的 App 的业务模块,它的目标是 App.vue。
    插件 (Plugin) 是用来增强你的技术栈的功能模块,它的目标是 Vue 本身。
    删除数组用delete和Vue.delete有什么区别?
    delete:只是被删除数组成员变为 empty / undefined,其他元素键值不变
    Vue.delete:直接删了数组成员,并改变了数组的键值(对象是响应式的,确保删除能触发更新视图,这个方法主要用于避开 Vue 不能检测到属性被删除的限制)
    watch怎么深度监听对象变化
    immediate设置为true就可以监听开始之后立即被调用
    deep设置为true 就可以监听到对象的变化

       let vm=new Vue({
           el:"#first",
           data:{msg:{name:'北京'}},
           watch:{
    
               msg:{
                   handler (newMsg,oldMsg){
                       console.log(newMsg);
                   },
                   immediate:true,
                   deep:true
               }
           }
       })
    

    watch和计算属性有什么区别?
    1.一个是侦听属性,一个是计算属性
    2.一个是为了应对复杂的逻辑计算,一个是对数据的变化作出反应
    3.一个是只有当缓存改变时才执行,一个是只要从新渲染就会执行
    4.一个有缓存,一个没有缓存
    watch可以深度监听复杂对象的变化;
    computed只能监听简单简单对象的变化
    能不用watch就不用watch, watch一般用在你要监听的属性与你要使用的属性没有太多关联的时候,一般在异步时使用
    vue组件之间的通信都有哪些?

    父子
        props
        $emit/$on
        ( $parents/$children ) / $refs
    兄弟
        Vuex
        Bus
    跨级
       Vuex
        Bus
        ( provide/inject )
        ( $attrs/$listeners )
    

    在vue组件中怎么获取到当前的路由信息?

    this.$route.path 或者 this.$router
    

    route和router有什么区别?
    route:代表当前路由信息对象,可以获取到当前路由的信息参数
    router:代表路由实例的对象,包含了路由的跳转方法,钩子函数等
    vue-router钩子函数有哪些?都有哪些参数?

    1.全局:
    前置守卫:beforeEach((to, from, next)=>{
    to:即将进入的路由对象
    form:当前导航正要离开的路由
    next():进行管道中的下一个钩子
    })
    解析守卫:beforeResolve((to, from, next)=>{})
    后置钩子:afterEach((to,form)=>{})
    
    路由:beforeEnter((to, from, next)=>{})
    
    组件:
    beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 this
    // 因为当守卫执行前,组件实例还没被创建
    },
    beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 this
    },
    beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 this
    }
    

    有用过vuex吗?它主要解决的是什么问题?推荐在哪些场景用?
    多个视图依赖同一个状态
    来自不同视图的行为需要变更同一状态
    适用于中大型的单页面应用
    我主要还是当全局变量来用的,比如登录人信息、token、浏览记录、跨组件的较大临时数据传递。
    以往需要调个方法取全局变量或缓存,其实反而增加了初始化流程,而会自动更新的 vuex 就很好用了。
    vuex的store有几个属性值?分别讲讲它们的作用是什么?
    state:存贮公共数据的地方
    Getters:获取公共数据的地方,获取根据业务场景处理返回的数据
    mutations:放的是同步的操作和reducer有点像 通过store的commit方法来让mutations执行;唯一修改state的方法,修改过程是同步的
    action:放的是异步的操作 通过分发操作触发mutation
    context是store的一个副本
    module 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割
    Vuex就是提供一个仓库,store仓库里面放了很多对象其中state即使数据源存放地,
    vuex中actions和mutations有什么区别?
    actions:主要用来处理异步,提交的是mutations,在组件中用dispatch()派发
    mutations:用来直接修改state的在组件中用this.$store.commit()触发
    其两个都可以用辅助函数mapActions

    相关文章

      网友评论

        本文标题:vue基础题

        本文链接:https://www.haomeiwen.com/subject/ttpvrltx.html