zoukankan      html  css  js  c++  java
  • vue04----watch、slot、响应式原理、set、vue脚手架(vue-cli)、单页面应用和多页面应用、单页面开发首屏加载过慢,白屏如何缓解

    ### watch监听:监听数据的变化

        data:{
            age:24
        },
        methods:{
            add(){
                this.age++;
            }
        },
        watch:{
            age(newValue,oldValue){
                console.log("新值",newValue)
                console.log("旧值",oldValue)
                console.log(this.$refs.p)// watch中的DOM是修改前的(新值)
                console.log(this.$refs.p.innerHTML)//旧值
            }
        }


        ①watch中的函数名称是data中的属性名称,因为watch也是依赖data中的属性,当data中的属性发生改变的时候,watch中的函数就会执行
        ②watch中的函数有两个参数,一个是newValue,一个是oldValue
        ③watch中的函数不需要调用
        ④watch只会监听数据的值是否改变,而不会监听数据的地址是否发生改变,如果需要监听对象的变化,需要进行深度监听
        ⑤特殊情况下,watch是兼听不到数组的变化的,例如数据的修改,通过length来清空数组
        ⑥如果想要检测到数组的变化要用splice或$set
        ⑦immediate(立即的)用来做页面首次加载的时候做一次监听(immediate:true)



    ### 插槽:slot,在组件内开辟一块空间,用来存放组件标签内部的内容


        命名插槽:<p slot="wql"></p>
                 <slot name="wql">


    ### 响应式原理:

        vue最大的特点就是数据驱动视图。
        vue的数据发生改变,页面一定发生改变?不一定。
        当操作引用类型的数据,动态添加属性时,页面不会发生改变。

        vue响应式数据的原理(也叫数据绑定原理、双向数据绑定原理):
            底层是Object.defineProperty(),目前vue2.6版本和将来的vue3.0(proxy)都是通过给data中的数据添加一个数据劫持(setter和getter方法),写在data中的数据自动加数据劫持。但是不管哪种版本,ie浏览器都有兼容性问题,vue2.6不兼容ie8以下,vue3.0不兼容ie11.
            Object.defineProperty()处理data中的数据,数据就添加上get和set方法,数据获取的时候触发get,数据修改的时候触发set。在修改数据的时候,优先触发set,触发watcher监听,再通知页面。
            vue中如果动态添加属性,该属性就没有经历过处理,就没有set和get方法,所以数据变页面不变。
            只有在data中的数据,在组件创建的时候,会执行Object.defineProperty(),拥有setter和getter。
            vue提供一个实例方法:vm.$set()可以添加一个响应式属性,会触发视图的更新。

        

    ### vm.$set(目标对象,"动态添加的属性名","属性值")

        向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新,它必须用于响应式对象上添加新属性,因为vue无法探测普通的新增属性。

        data:{
            info:{
                name:"吴小明",
                age24
            }
        }
        methods:{
            changeSex(){
                // data中的info中没有sex,动态添加的sex原本是没有set和get的,这里用Vue.set()处理过就有了 
                Vue.set(this.info,"sex","男");
            }
        }

        Vue.set(目标对象,"动态添加的属性名","属性值")   实例中使用,不带$
        Vue.$set()                                    组件中使用,带$

        Vue.set()和this.$set()一样


        tip:如果使用this.info.sex="男";就用this.$forceUpdate()强制刷新也可以


    ### vue脚手架(vue-cli)

        2018    vue-cli    2.9.6
        2019    vue/cli    3.9.3    操作简单

        npm install -g @vue/cli     安装vue-cli脚手架工具
        vue --version               查看脚手架工具的版本
        vue create demo             创建一个项目

        vue创建项目过程:
            ①vue create demo    vue版本:3.9.3,node版本:12.8.0
            ②Manually select features
            ③Babel、CSS Pre-processors(Router和Vuex暂时没装)
            ④Less
            ⑤In dedicated config files
            ⑥n

        vue项目启动:npm run serve

        查看文件目录:mac:ls   window:dir

        文件的目录结构:
            node_modules    安装的插件
            public          公有目录
                index.html  网页的入口文件,提供实例的挂载点
            src             源码目录
                assets      资源目录
                components  组件
                xxx.vue     单文件组件
                main.js     js的入口文件,创建一个实例,渲染一个根组件,将根组件挂载到渲染元素上

        使用组件:
            1、创建组件         xxx.vue
            2、抛出组件         export default {}
            3、哪里用哪里引入   import 组件名 form "路径";
            4、将引入的组件注册到components
                components:{组件名}
            5、将组件名当成标签名使用

        常用指令:
            npm install     按照package.json按照插件
            npm run serve   本地环境下运行
            npm run build   线上的编译打包  把js文件夹里的map文件删掉,给服务端人员上线






        预处理语言:less sass stylus


        全局安装yarn:npm install -g yarn
        卸载less:npm uninstall less less-loader





    ### Q:


        1、单页面应用和多页面应用
            单页面:SPA,只有一个html页面,浏览器一开始就加载所有的html、css、js。在交互时用路由动态载入,页面切换只刷新局部内容,不进行跳转。
            多页面:MPA,一个应用中有多个html页面,页面跳转时是整页刷新。

            单页面的优点:
                用户体验好
                前后端分离
                页面效果比较炫酷(如页面切换时的专场动画)
                跳转流畅
                组件复用,开发便捷
            单页面的缺点:
                不利于SEO
                导航不可用,如果一定要用导航需要自己实现前进和后退
                首屏加载过慢
                页面复杂度高

        2、单页面开发首屏加载过慢,白屏如何缓解
            路由懒加载:
                ①vue异步组件的方式  component:resolve=>require(["../page/home/index.vue"],resolve);
                ②ES6的import方式(推荐)    component:()=>import("../page/home/index.vue");
            骨屏架构加载
            首屏采用服务端渲染




  • 相关阅读:
    java的内部编码
    visual studio 快捷键
    C# ref和out总结
    C#函数3递归
    链表操作 两个链表间的相交性问题
    链表操作 有环链表问题
    链表操作 模拟问题
    链表操作 未排序链表的处理问题
    jjQuery 源码分析1: 整体结构
    jQuery 源码分析3: jQuery.fn/ jQuery.prototype
  • 原文地址:https://www.cnblogs.com/wuqilang/p/12271340.html
Copyright © 2011-2022 走看看