• Vue开发中的一些常见套路和技巧


    属性排放

    export default {
        name: '名称',
        components: { // 组件挂载a},
        created(){} // 数据获取
        beforeMount() {}, // 数据获取
        data: () => ({}), //响应式数据
        computed: {} // 计算属性集合
        methods: {} // 方法集合
        ... // 销毁页面不要的资源
    }
    

    管理请求加载状态

    async beforeMount(){
        // 开始加载
        this.loading = true
        try {
          const data = await getUserInfo()
        } catch (error) {
          console.log(error)
        } finally {
            // 停止加载
            this.loading = false
        }
    }
    
    

    Proxy跨域

    proxy: {
      "/api": {
        target: 'http://.......',
        changeOrigin: true, // 是否改变域名
        ws: true, // socket
        pathRewrite: {
          // 路径重写
          "/api": '' // 对拼接内容进行重写
        }
      },
      ....
    }
    
    

    对developer和build的打包进行不同配置

    大部分开发者都喜欢将Vue的config写在一个文件中,看起来是没有问题,但是随着环境的变化,项目优化,WebPack插件,等等具有针对性的配置进来后,就会显得稍微杂乱了,这个时候就可以考虑做单独的配置,通过process.dev分别对不同的环境进行一个config的引入,下面贴出我的配置方式。我在项目根目录下新建了一个config目录,里面将公共的方法进行拆包成一个public.js其他的根据生产环境和线下环境进行一个区分的编译。

    -- config
    --- dev.js
    --- build.js
    --- public.js
    vue.config.js
    
    # 代码 vue.config.js
    const devConfig = require('./config/dev')
    const buildConfig = require('./config/build')
    module.exports = process.env.NODE_ENV === 'development' ? devConfig : buildConfig
    
    

    计算属性实用

    // 计算属性
    computed: {
      filterList: function () {
      return this.showData.filter(function (data) {
        // 返回需要显示的数据
        return data.isShow
      })
    }
      
    // DOM
      
    <ul>
      <li v-for="item in filterList" :key="item.id">
      {{ item.name }}
      </li>
    </ul>
    
    

    集合方法

     tableFactory(action) {
      switch (action) {
        case 'update':
          ...
          break;
        
        case 'create':
          ...
          break;
          
        case 'delete':
          ...
          break;
      
        default:
          // ...默认获取列表
          break;
      }
    }
    
    

    保持对Props的数据验证规范

    props: {
        test: {
            type: String,
            default: ''
        },
        test2: {
            type: [Number, String],
            default: 1
        },
        test3: {
            required: false,
            type: Object
        }
    }
    
    

    组件名称使用

    大多时候,我们在组件中定义的name都是作为在template模板中使用的名称,这里建议使用驼峰命名,因为在vue中对驼峰命名做出了很好的解析。

    // GanMessage.vue组件
    export default {
        name: 'GanMessage'
        .....
    }
    
    // 引入后使用
    components: {
        [GanMessage.name]: GanMessage
    }
    
    // 模板中使用
    <template>
        <gan-message/>
    </template>
    
    

    模板引擎调试

    大多数时候,在template上面写一些逻辑非常难调试,都是直接看效果的,对于一些值来说,变得无法掌控,所以说在开发环境中,我都会在原型上挂一个全局的console.log方法进行调试

    vue.prototype.$logs = window.console.log;
    
    // 使用
    <template>
        {{$logs('1111')}}
    </template>
    
    

    获取数据的生命周期

    对于数据的获取一直都是又存在争议的,大部分同学都是在created中获取的吧,我个人是在beforeMount中进行后台数据请求获取的

    async beforeMount(){
        const data = await getUserInfo();
    }
    

    使用async 和 await

    大多数时候,在使用Promise的时候都是通过.then,.catch,.finally来进行处理的。但其实我更加的推荐使用async异步函数的方式来进行Pormise的处理,我们只需要进行数据的获取就好了,通过try异常捕获可以快速的对错误进行一个好的排查和抛出。参考上面获取数据的生命周期可以看到

    async beforeMount(){
        try {
          const data = await getUserInfo()
        } catch (error) {
          console.log(error)
        } finally {}
    }
    
    

    watch

    watch: {
        obj: {
          handler(newName, oldName) {
             console.log('obj.a changed');
          },
          immediate: true,
          deep:true
        },
        'obj.a': {
        handler(newName, oldName) {
          console.log('obj.a changed');
        },
        immediate: true,
        // deep: true
      }
        
      } 
    
    

    在自定义事件中,该值是从其子组件中捕获的值

    <!-- Child -->
    <template>
      <input type="text" @input="$emit('custom-event', 'hello')" />
    </template>
    
    <!-- Parent -->
    <template>
      <Child @custom-event="handleCustomevent" />
    </template>
    
    <script>
    export default {
      methods: {
        handleCustomevent (value) {
          console.log(value) // hello
        }
      }
    }
    </script>
    
    
  • 相关阅读:
    centos 7 pip install MySQL-python 报错
    修改centos history记录数上限
    CentOS 7 如何设置为eth0网卡
    字符串判空有空格报错:binary operator expected
    Linux指定用户运行程序
    MySQL 新建用户,为用户授权,指定用户访问数据库
    解决linux 中文乱码
    UNIX目录访问操作
    通过lseek产生空洞文件
    lseek系统调用
  • 原文地址:https://www.cnblogs.com/JinXinYuan/p/13912793.html
Copyright © 2020-2023  润新知