组件拆分中,兄弟组件通过pinia对el-dialog控制显隐

356 阅读2分钟

场景概括

在工作中,有时代码过于臃肿需要我们进行组件拆分,今天我面临了一个如下的场景:
在一个组件(我们称它为组件A)中有一个按钮,点击它需要使它的兄弟组件(我们称它为组件B)中的一个el-dialog进行显示。我们通过pinia来进行控制显隐的变量的存储,这个变量我们称为:dialogVisible。我们的目的是通过dialogVisibl控制组件B中el-dialog的显隐,并当el-dialog隐藏后dialogVisible的值为false。代码如下:

首先我们定义pinia:

import { defineStore } from 'pinia'

export const useDialogStore = defineStore({
  id: 'dialog',
  state: () => ({
    dialogVisible: false // 控制el-dialog的显示与隐藏的变量
  }),
  getters: {
    getDialogVisible() {
      return this.dialogVisible
    }
  },
  actions: {
    setDialogVisible(value) {
      this.dialogVisible = value
    }
  }
})

其次我们定义组件A

<template>
  <div>
    <button @click="showDialog">显示子组件的对话框</button>
  </div>
</template>

<script>
import { useDialogStore } from './dialogStore.js'
export default {
  setup() {
    // 使用pinia store
    const dialogStore = useDialogStore()
    // 定义一个方法,用来显示组件B的对话框
    const showDialog = () => {
      dialogStore.setDialogVisible(true)
    }
    return {
      showDialog
    }
  }
}
</script>

最后我们来定义组件B

<template>
    <el-dialog
      title="组件B的对话框"
      :visible.sync="dialogVisible"
      width="30%"
      @close="closeDialog"
    >
      <span>这是一个组件B的对话框</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="closeDialog">关闭</el-button>
      </span>
    </el-dialog>
</template>

<script>
import { useDialogStore } from './dialogStore.js'
export default {
  setup() {
    // 使用pinia store
    const dialogStore = useDialogStore()
    // 定义一个计算属性,用来获取pinia store中的变量
    const dialogVisible = computed(() => dialogStore.getDialogVisible())
    // 定义一个方法,用来关闭对话框
    const closeDialog = () => {
      dialogStore.setDialogVisible(false)
    }
    return {
      dialogVisible,
      closeDialog
    }
  }
}
</script>

通过上面的代码,我们就实现了所需的功能,即在组件A中点击按钮,可以控制组件B中el-dialog的显示与隐藏,而且当el-dialog关闭时,变量的值也会变为false。使用pinia这个状态管理库,来在全局定义和修改这个变量,从而实现组件间的通信。
如果jym有更好的方法,烦请指正,感谢浏览。😊