子组件调用父组件的方法

Vue中子组件调用父组件的方法,有三种方法:

一. 直接在子组件中通过this.$parent.event来调用父组件的方法

父组件

<template>
  <div>
    <child></child>
  </div>
</template>
<script>
  import child from '~/components/dam/child';
  export default {
    components: {
      child
    },
    methods: {
      fatherMethod() {
        console.log('测试');
      }
    }
  };
</script>

子组件:

<template>
  <div>
    <button @click="childMethod()">点击</button>
  </div>
</template>
<script>
  export default {
    methods: {
      childMethod() {
        this.$parent.fatherMethod();
      }
    }
  };
</script>

二.vue父组件直接调用子组件里方法

    父组件使用子组件,写上ref=""


<template>
  <div>
  	//父组件点击事件
    <el-button type="primary" @click="parentOpenDialog">打开弹窗</el-button>
    

	<dialog ref="dialog"></dialog>

  </div>
</template>
<script>
import dialog from "./components/dialog";
export default {
components: { dialog},
  data() {
    return {};
  },
  methods: {
    //父组件methods
	parentOpenDialog() {
	  this.$nextTick(() => {
	    this.$refs["dialog"].openDialog();
	  });
	},
  }
};
</script>




 子组件代码

<template>
  <div>
    <el-dialog title="父组件调用子组件方法" :visible.sync="dialogVisible">
      <div>父组件调用子组件方法</div>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dialogVisible: false,
    };
  },
  methods: {
    openDialog() {
      this.dialogVisible = true;
    }
  }
};
</script>



三. 在子组件里用$emit向父组件触发一个事件,父组件监听这个事件就行了。

父组件:

<template>
  <div>
    <child @fatherMethod="fatherMethod"></child>
  </div>
</template>
<script>
  import child from '~/components/dam/child';
  export default {
    components: {
      child
    },
    methods: {
      fatherMethod() {
        console.log('测试');
      }
    }
  };
</script>

子组件:

<template>
  <div>
    <button @click="childMethod()">点击</button>
  </div>
</template>
<script>
  export default {
    methods: {
      childMethod() {
        this.$emit('fatherMethod');
      }
    }
  };
</script>

四. 父组件把方法传入子组件中,在子组件里直接调用这个方法

父组件:

<template>
  <div>
    <child :fatherMethod="fatherMethod"></child>
  </div>
</template>
<script>
  import child from '~/components/dam/child';
  export default {
    components: {
      child
    },
    methods: {
      fatherMethod() {
        console.log('测试');
      }
    }
  };
</script>

子组件:

<template>
  <div>
    <child :fatherMethod="fatherMethod"></child>
  </div>
</template>
<script>
  import child from '~/components/dam/child';
  export default {
    components: {
      child
    },
    methods: {
      fatherMethod() {
        console.log('测试');
      }
    }
  };
</script>

props有两种接受方法,
1.用数组接收数据。不限制数据类型

props:['parentName'],

2.用对象接受数据。可以对数据类型进行限制;

props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true,
    },
    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100,
    },
    // 数组写法
    propK: {
      type: Array,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return ["张三"];
      },
    },
    // 带有默认值的对象
    propE: {
      type: Object,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return { message: "hello" };
      },
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ["success", "warning", "danger"].indexOf(value) !== -1;
      },
    }
  }

Logo

前往低代码交流专区

更多推荐