美文网首页
vue3 基于reactive 封装store

vue3 基于reactive 封装store

作者: ZCC_6b97 | 来源:发表于2020-12-08 13:59 被阅读0次

    1、各模块

    // src>store>homeData.js
    import { reactive } from "vue"
    
    const homeData ={
      name:'张三',
      setName(value){
        this.name = value
      }
    }
    export default reactive(homeData)
    
    // src>store>memberData.js
    import { reactive } from "vue"
    
    const memberData = {
      age: 0,
      setAge(value) {
        this.age = value
      }
    }
    export default reactive(memberData)
    
    // src>store>userInfo.js
    import member from './member'
    import homeData from './homeData'
    import { reactive } from 'vue'
    const userInfo = {
      getUserInfo () {
        return ` 名字${homeData.name} 年龄: ${member.age} `
       }
    }
    export default reactive(userInfo)
    
    // src>store>index.js
    import memberData from './member'
    import homeData from './homeData'
    import userInfo from './userInfo'
    
    const store = createStore({
      memberData,
      homeData,
      userInfo
    })
    
    function createStore(parmas) {
      return {
        install(app) {
          this.provide(app)
        },
        provide(app) {
          const keys = parmas&&Object.keys(parmas)
          keys&&keys.forEach((item) => { 
            // 注册
            app.provide(item,parmas[item])
          })
        }
      }
    }
    export default store
    
    

    2、 注册provide

    //main.js
    import { createApp } from 'vue'
    import App from './App.vue'
    import './index.css'
    import router from './router'
    import store from './store'
    
    const app = createApp(App)
    app.use(router).use(store)
    router.isReady().then(() => app.mount("#app"));
    

    3、 使用与赋值

    // holleWord.vue
    <template>
      <h2>{{nameAndAge}}</h2>
      <h2>{{nameAgeComputed}}</h2>
      <button @click="setAge(++age);">count is: {{ age }}</button>
      <button @click="setName(name==='ccc'?'aaa':'ccc')">name: {{ name }}</button>
      <div>{{getUserInfo()}}</div>
    </template>
    
    <script>
    import { computed, inject, reactive, ref, toRefs, watchEffect } from 'vue'
    
    export default {
      name: 'HelloWorld',
      props: {
        msg: String
      },
      setup(){
        const memberData = inject('memberData')
        const homeData = inject('homeData')
        const userInfo = inject('userInfo') // 模块内部组合响应式变量  getUserInfo 方法
        // watch 页面组合两个响应式变量
        const nameAndAge = ref('')
        watchEffect(()=>{
          nameAndAge.value =  memberData.age + homeData.name
        })
        // computed 页面组合两个响应式变量
        const nameAgeComputed = computed(() =>  memberData.age + homeData.name)
    
        const data = {...toRefs(memberData),...toRefs(homeData),...toRefs(userInfo), nameAndAge,nameAgeComputed}
        return data
      }
    }
    </script>
    

    相关文章

      网友评论

          本文标题:vue3 基于reactive 封装store

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