Vue3 setup风格父子组件多种传参和回调方式(亲测手写锦集)

5 篇文章 0 订阅

本文章是以Vue3 script setup的方式组件之间多种传参方式的演示代码。

1、父组件向子组件传参,子组件向父组件回调

最常用的方式,缺点是单向的子组件不能直接向父组件回写,通过回调实现。

<template>
  <div style="background-color: #20a0ff;text-align: center;padding: 10px;">
    <h1>父页组件</h1>
    名称:{{name}}
    <!--子组件,定义updateName事件-->
    <Son :id="id" :name="name" :data="data" @updateName="updateName"></Son>
  </div>
</template>
<script setup>
import Son from "./son"
//定义要传到子组件的参数
const id = ref("ID123456");
const name = ref("张三");
const data = ref({name: '张三', sex: "男"});

function updateName(val) {
  name.value = val;
  data.value.name = val;
}
</script>

子组件

<template>
  <div style="background-color: #79bbff;padding: 10px;">
    <h2>子页组件</h2>
    参数<br>
    {{ props.id }}<br>
    {{ props.name }}<br>
    {{ props.data }}
    <button @click="onclick('李四')">改成李四</button>
  </div>
</template>
<script setup>

const {proxy} = getCurrentInstance();
//定义父组件可以传进来的参数,限制传进来的参数类型,也可以不设置
const props = defineProps({
  id: {
    type: String,
    default: ''
  },
  name,
  data: {
    type: Object,
    default: {}
  },
})

function onclick(name) {
  //触发组件updateName事件,并传参
  proxy.$emit("updateName", name);
}
</script>

2、子组件向父组件双向绑定

按业务需求父组件要获取子组件修改的值时常用

<template>
  <div style="background-color: #20a0ff;text-align: center;padding: 10px;">
    <h1>父页组件</h1>
    名称:{{name}}
    <!--子组件-->
    <Son v-model:name="name"></Son>
  </div>
</template>
<script setup>
import Son from "./son"
//定义要传到子组件的参数
const name = ref("张三");
</script>
<template>
  <div style="background-color: #79bbff;padding: 10px;">
    <h2>子页组件</h2>
    参数<br>
    <input v-model="name2">
  </div>
</template>
<script setup>
//定义父组件可以传进来的参数,限制传进来的参数类型,也可以不设置
const props = defineProps({
  name: {
    type: String,
    default: ''
  },
})

//计算属性,当值修改时更新父页面的属性值
const emit = defineEmits();
const name2 = computed({
  get() {
    return props.name
  },
  set(val) {
    emit('update:name', val)
  }
})
</script>

3、父传子、子传孙、各种传参,可以是任意层级

通过 provide(‘name’, name); 向全局设置参数
通过 inject(‘name’); 获取全局中的参数
缺点:可能会有命名冲突问题,按业务需求使用

<template>
  <div style="background-color: #20a0ff;text-align: center;padding: 10px;">
    <h1>父页面</h1>
    名称:{{ name }}
    <!--子组件-->
    <Son v-model:name="name"></Son>
  </div>
</template>
<script setup>
import Son from "./son"
import {provide} from "vue";
//定义要传到子组件的参数
const name = ref("张三");
provide('name', name)
</script>
<template>
  <div style="background-color: #79bbff;padding: 10px;">
    <h2>子页组件</h2>
    参数<br>
    <input v-model="name">
    <Grandson></Grandson>
  </div>
</template>
<script setup>
import Grandson from "./grandson"
import {inject} from "vue";

const name = inject('name');
</script>
<template>
  <div style="background-color: #337ecc;padding: 10px;">
    <h2>孙子页组件</h2>
    参数<br>
    <input v-model="name">
  </div>
</template>
<script setup>
import {inject} from "vue";

const name = inject('name');
</script>

4、子组件向父组件传值、传函数,单向

通过defineExpose对外暴露子组件中的变量和函数

<template>
  <div style="background-color: #20a0ff;text-align: center;padding: 10px;">
    <h1>父页组件</h1>
    data:{{data}}<br>
    <button @click="onclick">调用子页面的函数</button>
    <!--子组件,定义updateName事件-->
    <Son ref="data"></Son>
  </div>
</template>
<script setup>
import { ref ,nextTick} from 'vue';
import Son from "./son"
//定义要传到子组件的参数
const data = ref({});

nextTick(()=>{
  console.log("data",data.value)
})

function onclick(){
//调用子页面的函数
  data.value.method();
}
</script>
<template>
  <div style="background-color: #79bbff;padding: 10px;">
    <h2>子页组件</h2>
    参数<br>
    {{name}}<br>
    <button @click="onclick('李四')">改成李四</button>
  </div>
</template>
<script setup>
const name = ref('李四')
const method= () => {
  console.log("我是子组件的方法")
  name.value="王五"
}
defineExpose({
  name,
  method
})

function onclick(val) {
  name.value = val;
}
</script>

求关注~~~

点关注不迷路,喜欢的朋友们关注支持一下
给点继续写的动力,感谢!!
Vue3中,使用`setup`语法可以在组件中定义逻辑。通过父子组件之间实时传参的实现有多种方式。 一种方式是使用`defineEmits`和`emit`来实现子组件向父组件传值。在子组件`waterFall.vue`中,可以使用`defineEmits`定义一个事件`on-click`,然后在`send`方法中使用`emit`来触发该事件,并传递参数。在父组件`App.vue`中,可以在子组件标签上使用`@on-click`绑定一个方法,当子组件触发`on-click`事件时,父组件的方法将被调用,传入子组件传递的参数。 另一种方式是通过`defineProps`来接收父组件传递的参数。在子组件`waterFall.vue`中,可以使用`defineProps`定义一个属性`title`,并设置其类型和默认值。在父组件`App.vue`中,可以在子组件标签上使用`:title`将值传递给子组件的`title`属性。 综上所述,通过使用`defineEmits`和`emit`可以实现子组件向父组件实时传参,而使用`defineProps`可以实现父组件向子组件实时传参。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Vue3】父子组件传参](https://blog.csdn.net/XiugongHao/article/details/131971259)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乾坤鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值