zoukankan      html  css  js  c++  java
  • mixin和composition api

    1. 这两个都是实现组件逻辑复用的法宝

    2. composition api是vue3的,  composition api的出现就是解决mixins的不足之处的

    一. mixin

    回顾下mixin, 用过vue老版本的都或多或少用过mixin

    混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

    mixins用的地方很多, 比如: 状态切换, 提示框和模态框显示影藏的逻辑 其实都可以复用的, 没必要重复写n遍,还有很多例子

    mixins用发很简单, 直接上代码:

    //新建一个 mixins.js
    
    export const myMixins = {
        data () {
            return {
                count: 1
            }
        },
        created () {
            this.onHello()
        },
        methods: {
            onHello () {
                console.log('hello from mixins')
            }
        }
    }
    //新建一个 TestOne.vue
    
    <template>
      <div>
        <h1>TestOne里面的{{ count }}</h1>
      </div>
    </template>
    
    <script>
    import { myMixins } from '@/pages/mixins/mixins.js' //引入你的 mixins.js
    export default {
      name: 'TestOne',
      mixins: [myMixins],
      created() {
        this.count++   //这边我+1
      }
    }
    </script>
    //再新建一个 TestTwo.vue
    
    <template>
      <div>
        <h1>TestTwo里面的{{ count }}</h1>
      </div>
    </template>
    
    <script>
    import { myMixins } from '@/pages/mixins/mixins.js' //引入mixins.js
    export default {
      name: 'TestTwo',
      mixins: [myMixins],
      created() {}
    }
    </script>

    然后页面呈现效果(此处省略一些废话了):

      我在TestOne.vue中count++ , count变成2   , TestTwo.vue中的count没有跟着遍!!(优点)

      

      Mixins优点:    组件逻辑复用,  不需要传递状态, 

               可以定义共用的变量,在每个组件中使用,引入组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响,

                  对于封装一小段想要复用的代码来讲是有用的。

                     

      Mixins缺点:     1. 命名冲突 问题!

            2. 隐含的依赖关系(mixin和使用它的组件之间没有层次关系。组件里的变量名称修改后,mixin里没改)

            3. 显而易见可能会被滥用!

            4. 不可知,不易维护, 写不好代码就容易散、新手难以理解算是弊端吧。(因为你可以在mixins里几乎可以加任何代码,props、data、methods、各种东西,就导致如果不了解mixins封装的代码的话,是很难维护的)

              5. mixin模式表面上看起来很安全。然而,通过合并对象来共享代码,由于它给代码增加了脆弱性,并且掩盖了推理功能的能力,因此成为一种反模式。

                                     (拓展:这边抬一手vuex vuex用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。)

    二.  composition api (vue3出的新功能, composition api : "我就是为解决mixins缺点而诞生的")  

        说到composition api, 那可厉害了, 兄弟们 , Composition API解决了mixins的缺点, 有点React Hooks的味道

      

      composition api 相对于 options api  更好的 代码组织, 更好的逻辑复用, 更好的类型推导

      composition api 和options api  如何选择: (没必要以为的追求composition api, 视情况而定:)

         

     话不多说, 上代码: composition api这么用:

     新建个useMouse.js (获取鼠标位置demo)

    import { reactive, ref, onMounted, onUnmounted } from 'vue'
    
    function useMousePosition() {
        const x = ref(0)  //ref生成值类型的相应数据,可用于模板和reactive, 通过 .value修改值
        const y = ref(0)
    
        function update(e) {
            x.value = e.pageX
            y.value = e.pageY
        }
       onMounted(() => {
            console.log('useMousePosition mounted')
            window.addEventListener('mousemove', update)
        })
    
        onUnmounted(() => {  //销毁鼠标移动事件  vue2的destroyed ===> vue3的 onUnmounted 
            console.log('useMouse unMounted')
            window.removeEventListener('mousemove', update)
        })
        return {
            x,
            y
        }
    }
    
    export default useMousePosition

     在新建一个 useMouse.vue 文件

    <template>
        <p>mouse position {{x}} {{y}}</p>
    </template>
    
    <script>
    import { reactive } from 'vue'
    import useMouse from './useMouse' //引入useMouse
    
    export default {
        name: 'MousePosition',
        setup() {
            const { x, y } = useMouse()
            return {
                x,
                y
            }
        }
    }
    </script>

    大功告成!

    composition 几乎没什么缺点, 唯一的缺点 可能是 心智负担 , 响应式开发确实比纯数据驱动要难一点 , 还是要点学习成本的

    那时候我只有一台录音机也没有电脑 也不敢奢求说唱会让自己的生活变好
  • 相关阅读:
    谈谈.Net中的协变和逆变(转)
    如何转移 mysql 数据库,更换服务器之后mysql如何还原
    华盾服务器管理专家,WEB后台密码忘记了,恢复默认初始密码
    合理设置应用程序池 保证网站合理运行
    2012年4月QQ企业邮箱收费后最新版图文教程开通QQ企业邮箱
    word的加密
    在IE下FLASH背景透明而在FF下不透明的解决方法
    当重装数系统/数据库之后,如何恢复数据库的账号 登录名/用户名 孤立用户 缩小ldf日志文件 修改sqlserver2000端口
    ISAPI_Rewrite的安装配置以及加载未知的原因/和无法使用的原因
    网站建设的功能模块说明
  • 原文地址:https://www.cnblogs.com/520BigBear/p/15695699.html
Copyright © 2011-2022 走看看