vuex-4.0.0-alpha.1 体验

安装

npm i -S vuex@4.0.0-alpha.1

or

yarn add vuex@4.0.0-alpha.1

例子

// 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
// 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
// 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
// old

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


// new

{
    setup(){

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

// new

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

hack

  • getter observe
// 将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

{
    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
{
    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 实现自定义的全局状态管理工具.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • ### store 1. Vue 组件中获得 Vuex 状态 ```js //方式一 全局引入单例类 // 创建一...
    芸豆_6a86阅读 724评论 0 3
  • Vuex 概念篇 Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式...
    Junting阅读 3,056评论 0 43
  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,924评论 0 7
  • Vuex Vuex是一个专门为Vue.js应用所设计的集中式状态管理架构,它借鉴了Flux和Redux的设计思想,...
    JunChow520阅读 1,563评论 2 0
  • 习惯养成很容易,戒掉却很难!!! 什么是Vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式...
    前端又又阅读 2,740评论 0 1