zoukankan      html  css  js  c++  java
  • vue 技巧

    1.状态共享

    随着组件的细化,就会遇到多组件状态共享的情况,Vuex当然可以解决这类问题,不过就像Vuex官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是vue.js 2.6新增加的Observable API ,通过使用这个api我们可以应对一些简单的跨组件数据状态共享的情况。

    如下这个例子,我们将在组件外创建一个store,然后在App.vue组件里面使用store.js提供的store和mutation方法,同理其它组件也可以这样使用,从而实现多个组件共享数据状态。

    首先创建一个store.js,包含一个store和一个mutations,分别用来指向数据和处理方法。

    import Vue from "vue";
    
    export const store = Vue.observable({ count: 0 });
    
    export const mutations = {
      setCount(count) {
        store.count = count;
      }
    };
    复制代码

    然后在App.vue里面引入这个store.js,在组件里面使用引入的数据和方法

    2.长列表性能优化

    我们应该都知道vue会通过object.defineProperty对数据进行劫持,来实现视图响应数据的变化,然而有些时候我们的组件就是纯粹的数据展示,不会有任何改变,我们就不需要vue来劫持我们的数据,在大量数据展示的情况下,这能够很明显的减少组件初始化的时间,那如何禁止vue劫持我们的数据呢?可以通过object.freeze方法来冻结一个对象,一旦被冻结的对象就再也不能被修改了

    export default {
      data: () => ({
        users: {}
      }),
      async created() {
        const users = await axios.get("/api/users");
        this.users = Object.freeze(users);
      }
    };
    复制代码

    另外需要说明的是,这里只是冻结了users的值,引用不会被冻结,当我们需要reactive数据的时候,我们可以重新给users赋值。

    export default {
      data: () => ({
        users: {}
      }),
      async created() {
        const users = await axios.get("/api/users");
        this.users = Object.freeze(users);
      },
      methods:{
        // 改变值不会触发视图响应this.data.users[0] = newValue
        // 改变引用依然会触发视图响应this.data.users = newArray
      }
    };
    复制代码

    3.去除多余的样式

    随着项目越来越大,书写的不注意,不自然的就会产生一些多余的css,小项目还好,一旦项目大了以后,多余的css会越来越多,导致包越来越大,从而影响项目运行性能,所以有必要在正式环境去除掉这些多余的css,这里推荐一个库purgecss,支持CLI、JavascriptApi、Webpack等多种方式使用,通过这个库,我们可以很容易的去除掉多余的css。

    npm i glob-all purify-css purifycss-webpack --save-dev
     
    const PurifyCSS = require('purifycss-webpack')
    const glob = require('glob-all')
    plugins:[
        // 清除无用 css
        new PurifyCSS({
          paths: glob.sync([
            // 要做 CSS Tree Shaking 的路径文件
            path.resolve(__dirname, './src/*.html'), // 请注意,我们同样需要对 html 文件进行 tree shaking
            path.resolve(__dirname, './src/*.js')
          ])
        })
    ]
    复制代码

    4.函数式组件

    函数式组件,即无状态,无法实例化,内部没有任何生命周期处理方法,非常轻量,因而渲染性能高,特别适合用来只依赖外部数据传递而变化的组件。

    写法如下:

    在template标签里面标明functional 只接受props值 不需要script标签

    <!-- App.vue -->
    <template>
       <div id="app">
        <List :items="['Wonderwoman', 'Ironman']" :item-click="item => (clicked = item)"
        />
           <p>Clicked hero: {{ clicked }}</p>
        </div>
        </template>
    <script>
    import List from "./List";
    
    exportdefault {
      name: "App",
      data: () => ({ clicked: "" }),
      components: { List }
    };
    </script>
    
    <!-- List.vue 函数式组件 -->
    <template functional>
        <div>
        <p v-for="item in props.items" @click="props.itemClick(item);">
          {{ item }}
        </p></div>
     </template>
    复制代码

    5.监听组件的生命周期

    比如有父组件Parent和子组件Child,如果父组件监听到子组件挂载mounted就做一些逻辑处理,常规的写法可能如下:

     // Parent.vue
    <Child @mounted="doSomething"/>
    
    // Child.vue
    mounted() {
      this.$emit("mounted");
    }
    复制代码

    这里提供一种特别简单的方式,子组件不需要任何处理,只需要在父组件引用的时候通过@hook来监听即可,代码重写如下:

    <Child @hook:mounted="doSomething"/>
    <Child @hook:updated="doSomething"/>
    复制代码

    当然这里不仅仅是可以监听mounted,其它的生命周期事件,例如:created,updated等都可以,是不是特别方便~

    再比如平时的绑定卸载事件:

    window.addEventListener('resize',this.handleResize)
    this.$on('hook:destroyed',() => {
        window.removeventListener('resize',this.handleResize)
    })
    复制代码

    更多有关hooks用法(useMounted,useComputed)可查看vue-hook源码

    6.Watch的初始立即执行

    当 watch 一个变量的时候,初始化时并不会执行,如下面的例子,你需要在created的时候手动调用一次。

    created() {
      this.fetchUserList();
    },
    watch: {
      searchText: 'fetchUserList',
    }
    复制代码

    上面这样的做法可以使用,但很麻烦,我们可以添加immediate属性,这样初始化的时候就会自动触发(不用再写created去调用了),然后上面的代码就能简化为:

    watch: {
      searchText: {
        handler: 'fetchUserList',
        immediate: true
      }
    }

    转载:https://juejin.im/post/5d861aabe51d4557ca7fde06

  • 相关阅读:
    CSS3实现0.5px的边框
    解决nvm导致终端启动慢的问题
    解决zsh: command not found: gitk,将git路径/usr/bin/git修改为/usr/local/bin/git
    MAC之zsh终端使用nvm安装指定版本node
    解决npm包node-sass下载失败问题
    forEach中使用async await的问题
    使用module-alias别名简化CommonJS的require路径
    关系型数据库的ACID
    Node.js ORM 框架对比
    mysql字符集 utf8 和utf8mb4 的区别
  • 原文地址:https://www.cnblogs.com/mary-123/p/12244065.html
Copyright © 2011-2022 走看看