VUE 子组件调用父组件的方法

5 篇文章 0 订阅

改了一个组件,组件里有些按钮需要调用方法,之前没有遇到过,都是对原本的element-ui的控件做二次封装,一般是在组件最外层加上@input @change 之类,但是这次是内部的按钮事件,就懵逼了。

研究很久,才发现可以在父组件里把方法当做子组件的参数传递进来。

子组件:

<template>
  <el-table ref="subTable" :data="formatData" :row-key="handleRowKey" :default-expand-all="expandAll" v-bind="$attrs"  @row-click="rowClick" @selection-change="handleSelectionChange">
    <el-table-column v-if="columns.length===0" width="150">
      <template slot-scope="scope">
        {{scope.$index}}
      </template>
    </el-table-column>
    <el-table-column v-else v-for="(column, index) in columns" :key="column.value" :label="column.text" :width="column.width" :add="column.add" :update="column.update">
      <template slot-scope="scope">
          <template>
              <span v-if="index === 0 && scope.row.parentId">
                  <el-radio v-model="radioCheck" :label="scope.row.id">{{scope.row[column.value] || scope.row[column.name]}}</el-radio>
              </span>
              <span v-else-if="index === 1 && scope.row.id">
                  <el-button v-if="scope.row.add===true" ref="buttoncreate" size="mini" type="primary" icon="el-icon-plus" circle @click="handlePage(scope.row,'create')"></el-button>
                  <el-button v-if="scope.row.update===true" ref="buttonupdate" size="mini" type="success" icon="el-icon-edit" circle @click="handlePage(scope.row,'update')"></el-button>
                  <el-button v-if="scope.row.delete===true" ref="buttondelete" size="mini" type="danger" icon="el-icon-delete" circle @click="handlePage(scope.row,'delete')"></el-button>
              </span>
              <span v-else-if="index === 2 && scope.row.orderNum">
                  <el-input-number v-model="scope.row.orderNum" placeholder="请输入排序" size="mini" :min="0" @change="changeOrderNum(scope.row)" style="width: 120px;"></el-input-number>
              </span>
              <template v-else>
                  {{scope.row[column.value] || scope.row[column.name]}}
              </template>
          </template>
      </template>
    </el-table-column>
    <slot></slot>
  </el-table>
</template>
<script>
    import treeToArray from './eval'
    export default {
        name: 'treeTable',
        data() {
            return {
                radioCheck: {}
            }
        },
        props: {
            data: {
                type: [Array, Object],
                required: true
            },
            columns: {
                type: Array,
                default: () => []
            },
            evalFunc: Function,
            evalArgs: Array,
            expandAll: {
                type: Boolean,
                default: true
            },
            changeOrderNum: {
                type: Function,
                default: null
            },
            handlePage: {
                type: Function,
                default: null
            }
        },
        computed: {
            // 格式化数据源
            formatData: function () {
                let tmp
                if (!Array.isArray(this.data)) {
                    tmp = [this.data]
                } else {
                    tmp = this.data
                }
                const func = this.evalFunc || treeToArray
                const args = this.evalArgs ? Array.concat([tmp, this.expandAll], this.evalArgs) : [tmp, this.expandAll]
                return func.apply(null, args)
            }
        },
        methods: {
            rowClick(row) {
                this.radioCheck = row.id
                this.$refs.subTable.clearSelection()
                this.$refs.subTable.toggleRowSelection(row)
                this.$emit('row-click', row)
            },
            handleSelectionChange(val) {
                this.$emit('selection-change', val)
            },

            handleRowKey(row) {
                return row.id
            }
        }
    }
</script>

用到的参数是:

changeOrderNum: {
                type: Function,
                default: null
            },
            handlePage: {
                type: Function,
                default: null
            }

 

父组件上的methods

//排序修改
            changeOrderNum(row) {
                let obj = { id: row.id, orderNum:row.orderNum }
                ......
            },
            //添加修改按钮事件
            handlePage(row, type) {
                if (type === 'create') {
                    this.handleAddMenu(row)
                }
                else if (type === 'update') {
                    this.handleEditMenu(row)
                }
                else if (type === 'delete') {
                    this.handleDelMenus(row)
                }
            },

 

调用的时候用v-bind来传参

<tree-table highlight-current-row :data="areaTreeRoot" :columns="columns" :expandAll="false" border :changeOrderNum="changeOrderNum" :handlePage="handlePage">
</tree-table>

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值