vue3父组件方法之间方法的互相调用

简介: vue3父组件方法之间方法的互相调用

场景描述


在项目开发中。我们可能会使用父组件调用子组件中的方法


也有可能子组件中调用父组件中的方法


下面我们来看一看组件之间方法的调用


父组件页面


<template>
  <div>
    <list-com ref="listRef"></list-com>
    <button @click="changeValue" >改变值</button>
  </div>
</template>
<script>
import listCom from "@/components/list-com.vue"
import { ref } from '@vue/reactivity'
export default {
  components:{
    listCom
  },
  setup () {
    let listRef=ref()
    function changeValue(){
      // 需要注意let listRef=ref() 不能够写在这个函数体内,
      // 否者listRef 将会找不到,因为有函数作用域
      listRef.value.fatherMess([{name:'杨洋'}])
    }
    return {changeValue,listRef}
  }
}
</script>


子组件页面


<template>
    <div>
        <h2>我是子组件</h2>
         儿子接受到的数据:{{ list.arr}}
    </div>
</template>
<script>
import { reactive } from '@vue/reactivity';
export default {
    setup () {
        let list=reactive({
            arr:[]
        })
        function fatherMess(mess){
            console.log('父组件给子组件的值',mess );
            list.arr=mess
        }
        // 虽然页面上没有使用这个函数,
        // 但是也要抛出去,否者父组件会报错 fatherMess is not a function 
        return {fatherMess,list}
    }
}
</script>


1425695-20210816221929359-648470000.png


出现 Uncaught TypeError: listRef.value.fatherMess is not a function 如何解决


出现这样的错误,是因为子组件中的事件 fatherMess函数。


并没有抛出出去哈


解决办法 子组件中  return {fatherMess}


1425695-20210816221937326-1437089499.png

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


<template>
    <div>
        <h2>我是子组件</h2>
        <button @click="getHander" >获取值</button>
    </div>
</template>
<script>
import { reactive } from '@vue/reactivity';
export default  {
    setup (props,{attrs,slots,emit}) {
        function getHander(){
            // 不能够在使用原来的 this.$partent.xxx()这种方式了
            emit('myclick','给父组件的值' )
        }
        return {getHander}
    }
}
</script>


父组件


<template>
  <div>
    <list-com  @myclick="myclick"></list-com>
  </div>
</template>
<script>
import listCom from "@/components/list-com.vue"
export default {
  components:{
    listCom
  },
  setup () {
    function myclick(mess){
      console.log(mess);
    }
    return {myclick}
  }
}
</script>


1425695-20210816221947132-1256034497.png

相关文章
|
17天前
|
JavaScript 前端开发 索引
「Vue3系列」Vue3 条件语句/循环语句
在 Vue 3 中,你可以使用条件语句来动态地控制模板中的渲染内容。Vue 提供了多种方式来实现条件渲染,包括 `v-if`、`v-else-if`、`v-else` 和 `v-show` 指令。
33 0
|
18天前
Vue3框架中让table合计居中对齐
Vue3框架中让table合计居中对齐
|
18天前
Vue3 子/父组件相互调用
Vue3 子/父组件相互调用
35 0
|
18天前
|
JavaScript
vue3 使用element plus 打包时 报错
vue3 使用element plus 打包时 报错
22 0
|
14天前
|
JavaScript 前端开发 数据安全/隐私保护
Vue3——如何实现页面访问拦截
Vue3——如何实现页面访问拦截
|
18天前
|
JavaScript
Vue项目中强制刷新页面的方法
Vue项目中强制刷新页面的方法
14 0
|
18天前
Vue3 子传父 暴露数据 defineExpose
Vue3 子传父 暴露数据 defineExpose
Vue3 子传父 暴露数据 defineExpose
|
8天前
|
JavaScript 算法 前端开发
vue3和vue2的区别都有哪些
【4月更文挑战第15天】Vue3与Vue2在响应式系统(Proxy vs. Object.defineProperty)、组件模块化(Composition API vs. Options API)、数据变化检测(Reactive API vs. $watch)、虚拟DOM算法(基于迭代 vs. 基于递归)及Tree-Shaking支持上存在显著差异。Vue3的改进带来了更好的性能和灵活性,适合追求新技术的项目。Vue2则因其成熟稳定,适合维护大型项目。选择版本需根据项目需求、团队情况和技术追求来决定。
13 0
|
9天前
|
JavaScript
vue3+vite项目配置ESlint
vue3+vite项目配置ESlint
12 0
|
9天前
乾坤子应用配置(vue3+vite)
乾坤子应用配置(vue3+vite)
13 0