您的位置:

vue3中使用vuex详解

一、vue3中使用vuex传值

在vue3中使用vuex可以方便地传递组件之间的数据。在使用vuex的过程中,首先需要安装并导入vuex库,然后创建一个store对象:

import { createStore } from 'vuex'

const store = createStore({
  state() {
    return {
      count: 0
    }
  },
  mutations: {
    increment(state) {
      state.count++
    }
  }
})

state为vuex中存放数据的地方,mutations为修改state数据的地方,可以在组件中通过commit来调用mutations并修改store中的数据:

store.commit('increment')

也可以通过vuex中的mapMutations方法来简化调用:

import { mapMutations } from 'vuex'

export default {
  methods: {
    ...mapMutations(['increment'])
  }
}

这样就可以在组件中使用this.increment()来调用mutations中的increment方法,从而修改store中的数据了。

二、vue3不使用vuex

在vue3中,除了使用vuex传递数据之外,也可以直接使用props来传值,或使用 provide/inject 来实现跨组件传值。

使用props来传值,可以直接在父组件中给子组件传递值:

<template>
  <child-component :name="name"></child-component>
</template>

<script>
  import ChildComponent from './ChildComponent.vue'

  export default {
    name: 'ParentComponent',
    components: {
      ChildComponent
    },
    data() {
      return {
        name: 'Tom'
      }
    }
  }
</script>

在子组件中使用props来接收父组件传递的值:

<template>
  <p>{{ name }}</p>
</template>

<script>
  export default {
    name: 'ChildComponent',
    props: {
      name: {
        type: String,
        default: ''
      }
    }
  }
</script>

使用provide/inject来跨组件传值,可以在父组件中使用provide提供数据,在子组件中使用inject访问数据:

// 父组件中
export default {
  provide() {
    return {
      name: 'Tom'
    }
  }
}

// 子组件中
export default {
  inject: ['name'],
  mounted() {
    console.log(this.name) // 输出 'Tom'
  }
}

三、vue3中使用jsx

在vue3中可以使用jsx来编写组件,而在使用vuex传值的过程中也可以使用jsx来调用state和mutations中的数据和方法:

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

export default defineComponent({
  setup() {
    const store = useStore()

    const count = computed(() => store.state.count)

    function increment() {
      store.commit('increment')
    }

    return () => (
      <div>
        <p> Count: {count.value} </p>
        <button onClick={increment}>Increment</button>
      </div>
    )
  }
})

使用jsx需要先导入defineComponent和useStore方法,定义组件中的数据和方法,最后在setup方法中返回一个渲染函数,通过jsx来渲染页面。

四、vue3中使用axios

在vue3中使用axios可以方便地进行接口请求。在安装axios库之后,可以在组件中通过import导入axios库,然后在methods中定义请求方法:

import axios from 'axios'

export default {
  name: 'UsersList',
  data() {
    return {
      users: []
    }
  },
  methods: {
    getUsers() {
      axios.get('/api/users').then(({ data }) => {
        this.users = data
      })
    }
  },
  mounted() {
    this.getUsers()
  }
}

这样就可以在请求到数据之后将数据保存到组件的data中,然后在页面中通过v-for循环渲染数据。

五、vue3中使用vue2组件

在vue3中使用vue2组件需要先导入vue2的库,并在setup方法中使用defineComponent方法来定义组件:

import { defineComponent } from 'vue'
import Vue2Component from './Vue2Component.vue'

export default defineComponent({
  components: {
    Vue2Component
  },
  setup() {
    return () => (
      <div>
        <Vue2Component />
      </div>
    )
  }
})

在setup方法中,需要使用return返回一个渲染函数,然后在模板中渲染vue2组件,在components中定义注册vue2组件的方法。

六、vue3中使用vue2生命周期不执行

在vue3中使用vue2组件时,vue2组件中的生命周期会被触发两次,需要手动去重:

mount() {
  if(!this.$refs.vue2Component) {
    const Vue2Component = this.$options.components.Vue2Component
    const instance = new Vue2Component()

    instance.$mount()
    this.$refs.vue2Component.appendChild(instance.$el)
  }
}

在mount钩子函数中,判断当前是否已经包含了vue2组件,如果没有则新建一个vue2组件实例并挂载到当前组件中。

七、vue3中的proxy

在vue3中使用了proxy来替代vue2中的defineProperty实现数据的响应式。proxy可以对整个对象进行代理,而不仅限于属性级别的监听。

在vue3的setup方法中,可以通过ref来创建响应式的变量:

import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    return {
      count
    }
  }
}

在vue3中,通过ref创建出来的变量是一个对象,需要通过.value来获取变量的值。

八、为什么vue3不推荐用vuex了

vue3中使用了proxy来替代vue2中的defineProperty实现数据的响应式,同时也重构了数据响应式机制和状态管理机制,使得状态管理变得更加简单和灵活,所以vue3中更加推荐使用组合式API来进行状态管理。

对于小型的应用程序,使用组件内部的状态即可,不需要使用vuex。对于大型的应用程序,可以将一些通用的状态封装成逻辑块,然后在不同的组件中复用。

九、vuex只能用于vue吗

vuex是与vue框架紧密耦合的状态管理库,但是也可以在react等其他框架中使用。需要使用vuex提供的“vue”插件来实现在其他框架中使用vuex。

在react中使用vuex:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

export default store

在其他框架中使用vuex需要先导入vue,并使用Vue.use()来安装vuex插件,然后可以像使用vue中的vuex一样使用。

十、替代vuex选取

如果不想使用vuex来进行状态管理,还有一些其他的状态管理库可以选择:

  • Vuex-pathify:简化vuex的使用和管理,提高代码的开发效率;
  • Pinia:使用Composition API构建的强类型状态管理库;
  • Easy Peasy:使用React Hooks和RxJS的状态管理库。

使用这些替代库,可以根据项目的需要选择最适合的状态管理库。