返回

vuex与业务组件及UI组件的相互作用

前端

业务组件与UI组件交互的模式

vue-element-admin的业务组件与UI组件的交互的模式与vuex与业务组件的交互模式是一致的,也就是说业务组件与UI组件交互也是通过$emit、@事件、props等方式。业务组件和UI组件通过emit、on、props实现通信。

  • vuex与业务组件交互,vuex作为全局状态管理工具,业务组件通过$emit、@事件、props等方式与vuex进行交互。
  • 业务组件与UI组件交互,业务组件通过$emit、@事件、props等方式与UI组件进行交互。

下面将继续了解vuex与UI组件的交互,并且对前面的内容进行补充。

vuex与UI组件的交互

vuex与UI组件的交互与vuex与业务组件的交互也是一致的,也就是说vuex通过Provide和Inject的方式,向UI组件提供数据和方法。vuex通过provide和inject实现与UI组件的通信。

Provide和Inject都是Composition API提供的特性,通过Provide和Inject可以让组件将值传递给其子孙组件。

Provide and Inject大致用法如下:

// 在组件内使用 provide 声明需要提供的属性
export default {
  name: "Parent",
  setup () {
    const foo = ref("foo")

    provide("foo", foo)
  },
  template: '<Child/>'
}

// 在子组件中使用 inject 注入属性
export default {
  name: "Child",
  setup () {
    const foo = inject("foo")

    return {
      foo
    }
  },
  template: '<div>{{ foo }}</div>'
}

在vuex中,我们将vuex的state挂载到根组件中,然后使用provide将state提供给子孙组件。

import { reactive } from 'vue'
import { createStore } from 'vuex'

// 全局状态
const store = createStore({
  state: reactive({
    count: 0
  })
})

// 根组件
export default {
  name: "App",
  setup () {
    // 挂载store
    provide('store', store)
  },
  template: `<div><Child/></div>`
}

// 子组件
export default {
  name: "Child",
  setup () {
    const store = inject('store')
    
    return {
      count: store.state.count
    }
  },
  template: `<div>{{ count }}</div>`
}

这样子子孙组件就可以访问vuex的state了。

组件数据更新

由于vuex与UI组件的交互是异步的,所以在vuex的state更新后,UI组件并不会立即更新。我们可以使用watch方法来监听vuex的state的变化,当vuex的state变化后,UI组件就会立即更新。

export default {
  name: "Child",
  setup () {
    const store = inject('store')

    watch(store.state.count, (newValue, oldValue) => {
      console.log('count changed from', oldValue, 'to', newValue)
    })

    return {
      count: store.state.count
    }
  },
  template: `<div>{{ count }}</div>`
}

获取vuex的getter

vuex的getter是用来获取vuex的state的计算属性,我们可以使用inject方法来获取vuex的getter。

export default {
  name: "Child",
  setup () {
    const store = inject('store')

    const doubleCount = computed(() => {
      return store.getters.doubleCount
    })

    return {
      doubleCount
    }
  },
  template: `<div>{{ doubleCount }}</div>`
}

触发vuex的mutation

vuex的mutation是用来修改vuex的state的,我们可以使用inject方法来获取vuex的mutation,然后就可以使用vuex的mutation来修改vuex的state了。

export default {
  name: "Child",
  setup () {
    const store = inject('store')

    const increment = () => {
      store.commit('increment')
    }

    return {
      increment
    }
  },
  template: `<button @click="increment">+</button>`
}

总结

通过以上内容的学习,我们了解了vuex与业务组件、UI组件的交互方式,同时我们了解了vuex与组件通信的原理。在后续的学习中,我们会继续深入学习vuex,并且使用vuex来构建一个完整的vue项目。