javascript - 如何在 Vue.js 中的两个组件之间共享方法?

标签 javascript vue.js vuejs2 vuex ag-grid

我有一个 Ag-Grid,它具有某些操作按钮和从 MongoDB 数据库填充的动态数据。我的 MasterData.Vue 文件中有一个刷新网格的方法。我的网格记录中的每个操作按钮都执行更新/删除操作。当我单击这些按钮时,我在另一个 Modal.Vue 文件中设计了一个自定义的弹出模式组件。我想在 Modal.Vue 中调用 RefreshGrid() 方法。我尝试使用 props 来共享数据,但同样的事情在方法上不起作用。

MasterData.Vue 脚本

<script>
import { AgGridVue } from 'ag-grid-vue';
import { mapGetters } from 'vuex';
import gridEditButtons from '@/components/GridEditButton';
import MasterModal from '@/components/MasterModal';
export default {
  name: 'masterData',
  data () {
    return {
      addBtnClick: false,
      delBtnClick: false,
      editVisible: false,
      selected: 'Business Area',
      dropdown_tables: [
        'Business Area',
        'Council',
        'Sub Area',
        'Type',
        'Work Flow Stage'
      ],
      gridOptions: {
        domLayout: 'autoHeight',
        enableColumnResize: true,
        rowDragManaged: true,
        animateRows: true,
        context: {
          vm: null
        }
      }
    };
  },
  components: {
    'ty-master-modal': MasterModal,
    'ag-grid-vue': AgGridVue,
    gridEditButtons
  },
  methods: {
  // Filter Grid Contents based on Dropdown selection
    RefreshGrid: function () {
      let cName;
      if (this.selected === 'Business Area') {
        cName = 'businessarea';
      } else if (this.selected === 'Council') {
      cName = 'council';
      } else if (this.selected === 'Type') {
        cName = 'typemaster';
      } else if (this.selected === 'Work Flow Stage') {
        cName = 'workflowstage';
      }
      let obj = {
        vm: this,
        collectionName: cName,
        action: 'masterData/setMasterData',
        mutation: 'setMasterData'
      };
      this.$store.dispatch(obj.action, obj);
    }
};
</script>

Modal.Vue 脚本

<script>
import {mapGetters} from 'vuex';

export default {
  name: 'MasterModal',
  props: {
    readOnly: Boolean,
    entryData: Object,
    addBtnClick: Boolean,
    delBtnClick: Boolean,
    editVisible: Boolean,
    selectedTable: String
  },
  data () {
    return {
      fieldAlert: false,
      isReadOnly: false,
      dialog: false,
      dialogDelete: false,
      valid: false,
      visible: false,
      disable: false
    };
  },
  computed: {
    ...mapGetters('masterData', {
      entryState: 'entryState',
      // entryData: 'entryData',
      columns: 'columns',
      selectedRowId: 'selectedRowId'
    })
  },
  watch: {
    addBtnClick: function (newValue, oldValue) {
      this.setDialog(!this.dialog);
    },
    editVisible: function (newValue, oldValue) {
      this.setVisible(!this.visible);
    },
    delBtnClick: function (newValue, oldValue) {
      this.setDialogDelete(!this.dialogDelete);
    }
  },
  methods: {
    setDialog (bValue) {
      this.dialog = bValue;
    },
    setDialogDelete (bValue) {
      this.dialogDelete = bValue;
    },
 }
};
</script>

最佳答案

有几种方法可以实现这一目标。

一种是使用emit

MasterModal.vue组件中运行this.$emit('refreshGrid')在父 MasterData.Vue 组件中使用 <ty-master-modal @refreshGrid="RefreshGrid" ...>

如果您有直接的亲子关系,这可能是最好的选择

另一种方法是将函数作为 prop 传递给子组件。

<ty-master-modal :onRefreshGrid="RefreshGrid" ...>

并添加一个 Prop onRefreshGridMasterModal.vue,然后你就可以调用该函数了。

使用 vuex 的另一种方法是将监视添加到 MasterData.Vue 并监视 vuex 存储中的变量,即。 actionInvoker 。当actionInvoker改变, Action 执行。要更改该值,请将其设置为 0 并递增或切换,或设置为随机值。优点是您可以从任何地方调用它。

这个(和之前的)解决方案的问题在于,您的功能与不应该存在的 View /组件相关联。我会推荐第三种解决方案,即将功能推送到 vuex 操作中,然后您可以从任何地方调用它。但这需要您存储 selected vuex 中的变量也是如此,如果您想要有 Modal 和 Master 组件的多个实例,单个存储将禁止这样做(除非您添加对多个实例的支持)。

关于javascript - 如何在 Vue.js 中的两个组件之间共享方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51409299/

相关文章:

javascript - Vue js 与简单的 JavaScript Vue 未定义

javascript - 组件对 Mounted() 发出 GET 请求,并向子组件发出 props 响应。如果我输入直接转到子组件的 URL 会发生什么?

vue.js - 是否可以在 Vue 3 中使用 Vue 2 库,反之亦然?

函数内的javascript函数

javascript - 我想给 Elements 填充 Javascript

javascript - 单击其他元素与单击此元素相同

javascript - 将 vuex 存储导入 axios 和 app.js 文件

javascript - 新建一个div,显示在页面鼠标光标所在的位置

javascript - 如何仅在单击确定按钮后才使元素 UI 时间选择器设置值?

javascript - 如何使用 v-for 使用 vue.js 渲染表格