前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vuex-4.0.0-alpha.1 体验

vuex-4.0.0-alpha.1 体验

作者头像
copy_left
发布2020-04-24 18:27:38
2.3K1
发布2020-04-24 18:27:38
举报
文章被收录于专栏:方球方球

安装

代码语言:javascript
复制
npm i -S vuex@4.0.0-alpha.1

or

yarn add vuex@4.0.0-alpha.1

例子

代码语言:javascript
复制
// store.js

import { createStore } from 'vuex'

const subModel = createStore({
    namespaced: true,
    state: {
        target: 'xxx'
    },
    
    mutations: {
        updateTarget(state, newTarget){
            state.target = newTarget
        }
    }
})

export default createStore({
    
    state: {
        
        id: 'xxxx',
        prefix: 'mini',
        name: 'wolf'
    },

    getters: {
        fullName(state){ return `${state.prefix}-${state.name}` }
    },

    mutations: {
         updateName(state, newName){
            state.name = newName
        }
    },
    moduels:{ subModel }
})




// main.js

import { createApp } from 'vue'
import App from './App.vue'
import store from './store.js'

// 创建应用
const app = createApp(App)
// 注册 store
app.use(store)



// page

import { useStore } from 'vuex'
import { computed } from 'vue'

export default {
    setup(){
        // 获取store实例
        const store = useStore()
        // 绑定响应
        const name = computed(() => store.state.name)
        const fullName = comoputed(() => store.getters.fullName)
        const target = computed(() => store.state.subModel.target )
        return {
            
            name,
            fullName,
            target
        }

    }

}

使用对比

  • state
代码语言:javascript
复制
// old
{
    computed:{
        name(){ return this.$store.state.name },
        ...mapState('moduleName', [...])
    }

}

// new
{
    
    setup(){

        // 单一值引入
        const name = computed(() => store.state.name )

        // 引入整个state
        const name = computed( () => store.sate )
    }
    
}
  • getter
代码语言:javascript
复制
// old

{
    computed:{
        name(){ return this.$getters.state.name },
        ...mapGetters('moduleName', [...])
    }
}
    
    
// new
{
    
    setup(){

        // 单一值引入
        const name = computed(() => store.getters.name )

        // 引入整个state
        const name = computed( () => store.getters )
    }
    
}
  • mutation
代码语言:javascript
复制
// old

{
   methods: {
       
       updateName(){
           this.$store.commit('method name', data)
       },
           
      ...mapMutations([
          'methodName'
      ])
       
   }
}


// new

{
    setup(){

        const updateName = newName => store.commit("name", newName)
        
    }
}
  • action
代码语言:javascript
复制
// old
{
    methods:{
        load(){
            this.$store.dispatch('methodName', data)
        },
        ...mapActions(['methodName'])
    }
}

// new

{
    setup(){
        const load = () => store.dispath('methodName', data)
    }
}

hack

  • getter observe
代码语言:javascript
复制
// 将computed 放在 getter中
{
    
    state:{ name: 'coco' },
    getters:{
        
        observeName(state){
            return computed(() => state.name)
        }
        
    }
    
}

// page
{
    
    setup(){
        
        return {
            name: store.state.name // 不响应值变化
            observeName: store.getters.observeName // 响应值变化
        }
    }
    
}

通过 getter 返回包装后值,减少组件内的 computed 包装

  • state data-prop
代码语言:javascript
复制
{
    setup(){
        
        return {
            
            name: store.state.name,
            nameCopy: store.state.name,
            staticName: 'xxx'

        }
        
    },
    
    template:`
        
        <h1> {{ name }} </h1>
        <h1> {{ nameCopy }} </h1>
        <input v-model='name' />

        <h1> {{ staticName }} </h1>
        <input v-model='staticName' />

    `
}

纯值不能作为 v-model 绑定值, 随着 input 的输入, name 响应值变化, nameCopy 未响应,

  • state ref
代码语言:javascript
复制
{
    state: {
        refName: ref('name')
    }
}


// page
{
    setup(){
        const store = useStore()
        
        return {
            refName: store.state.refName
        }
    },
   template:`
        
        <input v-modle='refName'></input>

    `
}

直接使用 ref 作为state, 类似实现全局变量, 不推荐这种使用方式 直接屏蔽单项数据流模式。

总结

新的vuex 基础使用及api 没要太大变化, 调用方式更灵活. 但在当前的新的vue 版本下, vuex 存在的意义不大.

对于中小项目, 完全可以依靠 vue 实现自定义的全局状态管理工具.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 例子
  • 使用对比
  • hack
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档