zoukankan      html  css  js  c++  java
  • vue:父组件调用子组件的方法和子组件调用父组件的方法

    父组件调用子组件的方法

    组件中使用ref和$refs来实现给子组件传值或者调用子组件的方法

    在Vue中一般很少会用到直接操作DOM,但不可避免有时候需要用到,这时我们可以通过ref和$refs这两个来实现.

    ref 被用来给子组件注册引用信息, 引用信息将会注册在父组件的 $refs 对象上,如果是在子组件上使用,引用就指向(子)组件的实例。

    $refs 是一个对象,持有已注册过 ref 的所有的子组件。

    可以使用ref和$refs来实现给子组件传值

    子组件代码如下:

    <template>
        <div>
            <el-dialog :title="textMap[dialogStatus]+'工艺节点信息'" :visible.sync="dialogFormVisible" width="35%"
                @close="clearForm">
                <div>
                    <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="180px" class="demo-ruleForm">
                        <el-form-item label="节点名称" prop="mesNodeNo">
                            <el-select v-model="ruleForm.mesNodeNo" placeholder="请选择" style="100%"
                                @change="getValue">
                                <el-option v-for="item in dataSetItemList" :key="item.itemCode" :label="item.itemName"
                                    :value="item.itemCode">
                                </el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="投入产出表关联方式" prop="relaInfo">
                            <el-select v-model="ruleForm.relaInfo" placeholder="请选择" style="100%">
                                <el-option v-for="item in dataSetItemList2" :key="item.itemCode" :label="item.itemName"
                                    :value="item.itemCode">
                                </el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="与上下级节点关联方式" prop="relaNext">
                            <el-select v-model="ruleForm.relaNext" placeholder="请选择" style="100%">
                                <el-option v-for="item in dataSetItemList2" :key="item.itemCode" :label="item.itemName"
                                    :value="item.itemCode">
                                </el-option>
                            </el-select>
                        </el-form-item>
                    </el-form>
                </div>
            </el-dialog>
        </div>
    </template>
    
    <script>
    
        export default {
            name: 'MesDialog',
            data() {
                return {//节点字典列表
                    dataSetItemList: [],
                    //投入产出字典列表
                    dataSetItemList2: []</script>

    父组件代码如下:

    <template>
        <div class="app-container">
            <node-config-dialog ref="nodeConfigDialog" @saveInfo="saveInfo"></node-config-dialog>
        </div>
    </template>
    
    <script>
        import NodeConfigDialog from './NodeConfigDialog'
        export default {
            name: 'NodeConfig',
            components: {
                NodeConfigDialog
            },
            data() {
                return {//数据集合代码,节点
                }
            },
            methods: {
                //查询字典数据
                getDataSetItems() {
                    dataSet.getDataSetItemByDataSet({ dataCode: this.dataSetCode }).then(res => {
                        if (res.data.length != 1) {
                            this.$message.error("查询数据集合列表失败")
                            return
                        }
                        this.$refs.nodeConfigDialog.dataSetItemList = res.data[0].itemList
                    }).catch(err => {
                        console.log(err)
                    })
                },
                  getDataSetItems2() {
                      dataSet.getDataSetItemByDataSet({ dataCode: this.dataSetCode2 }).then(res => {
                          if (res.data.length != 1) {
                              this.$message.error("查询数据集合列表失败")
                              return
                          }
                          this.$refs.nodeConfigDialog.dataSetItemList2 = res.data[0].itemList
                      }).catch(err => {
                          console.log(err)
                      })
                  },
            }
        }
    </script>

    父组件通过$refs给子组件的属性赋值。

    一、使用ref和$refs来实现父组件调用子组件的方法

    父组件:

    <template>
      <el-container style="margin: 0 auto;  80%;">
        ......
        <auditor-edit ref="auditor-edit" @listenToAuditor="getAuditors"/>
      </el-container>
    </template>
    <script>
    import Auditor from './auditor'

    export default {
    name: 'Edit',
    components: {
    'auditor-edit': Auditor
    },
    data() {
    return {
    }
    },
    methods: {
    handleAuditor() {
    this.$refs['auditor-edit'].openDialog()
    }
    }
    }

    子组件:

    <script>
        export default {
            name: "auditor",
          data(){
              return{
                
              }
          },
          methods:{
            openDialog(){
              this.dialogFormVisible=true;
              this.getAllDeptAllUsers();
            }
          },
        }
    </script>

    子组件调用父组件的方法

    一、父组件将方法传递到子组件:父组件通过provide提供方法,子组件通过inject注入方法,在子组件调用父组件的方法

    在本vue案例中,由于子组件通过调用父组件的方法的方式传参,从而实现修改父组件data中的对象,所以需要啊使用$forceUpdate()进行强制刷新

    vue父组件:

    
    
    provide() {
    return {
    selectBase: this.selectBase
    };
    },

    methods: { selectBase(area) { this.edit.areaId = area.areaId; this.edit.areaName = area.areaName; this.$forceUpdate(); }, }

    vm.$forceUpdate():迫使 Vue 实例重新渲染。在vue框架中,如果data中有一个变量:age,修改他,页面会自动更新。但如果data中的变量为数组或对象,我们直接去给某个对象或数组添加属性,页面是识别不到的。

    vue子组件:

    先注入:

    inject: ["selectArea"],

    再使用

    handleSelect(row) {
            const area = {
              areaId: row.areaId,
              areaName: row.areaName
            };
            this.selectArea(area);
            this.dialogFormVisible = false;
    }

     二、父组件通过属性绑定将方法传递到子组件

    父组件:

    <template>
      <el-menu class="navbar" :style="background" mode="horizontal">
        <hamburger :toggle-click="toggleSideBar" :is-active="sidebar.opened" class="hamburger-container"/>
      </el-menu>
    </template>

    方法:

    methods: {
        toggleSideBar() {
          this.$store.dispatch('ToggleSideBar')
        }
      }

    子组件:

    先接收:

    <template>
    <div>
    <svg
    :class="{'is-active':isActive}"
    t="1492500959545"
    class="hamburger"
    viewBox="0 0 1024 1024"
    version="1.1"
    xmlns="http://www.w3.org/2000/svg"
    p-id="1691"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    width="64"
    height="64"
    style="color: #FFFFFF"
    @click="toggleClick">
    <path
    d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776
    56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776
    966.8023 568.849776z"
    p-id="1692" fill="#ffffff"/>
    <path
    d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776
    56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125
    966.8023 881.527125z"
    p-id="1693" fill="#ffffff"/>
    <path
    d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799
    56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345
    966.8023 256.17345z"
    p-id="1694" fill="#ffffff"/>
    </svg>
    </div>
    </template>

    <script> export default { name: 'Hamburger', props: { isActive: { type: Boolean, default: false }, toggleClick: { type: Function, default: null } } } </script>

    注意:子组件接收方法时使用的type为Function。

  • 相关阅读:
    一天快速入门Python语法基础之类与继承
    一天快速入门Python语法基础之函数
    一天快速入门Python语法基础之用户输入和if while语句
    一天快速入门Python语法基础之字典
    一天快速入门Python语法基础之操作列表
    应用Maven管理SringMvc+MyBaties登录功能的实现
    在eclipse中使用Maven以及HelloWorld的实现
    C++和Java实现基本的选择排序和常见错误
    Maven的安装和配置以及HelloWorld的实现
    POJ--3311--Hie with the Pie(暴力枚举+floyd)/(状态压缩DP+floyd)
  • 原文地址:https://www.cnblogs.com/zwh0910/p/14067738.html
Copyright © 2011-2022 走看看