Vue3+Ts实现父子组件间传值的两种方式
概览:
方式 | 特点 |
---|---|
v-model + emit | 简单明了,无复杂操作时使用 |
v-bind + emit | 功能齐全,使用麻烦,推荐数据处理较多时使用 |
1、v-model+emit传值
说明:v-model数据双向绑定的指令。
1.1父向子传递数据
1.父组件引入子组件;
2.使用v-mode
l绑定一个引入子组件的属性(如:num);
3.子组件中使用defineProps
接收。
1.2子向父传递数据
1.声明defineEmites
;
2.在defineEmits
中声明(event: 'update:num', n: number): void
;
3.进行事件触发执行emit('update:num', 40)
代码示例:
// 父组件 <template> <div> <div> <div> 父组件 {{ num1 }}</div> <button @click="add">父按钮</button> </div> <!-- v-model的传值 --> <Child v-model:num="num1"></Child> </div> </template> <script setup lang="ts"> import Child from './02-AppChild.vue' import { ref } from 'vue' let num1 = ref(20) const add = () => { num1.value++ } </script> <style scoped></style>
//子组件 <template> <div> <div>子组件{{ num }}</div> <div>{{ n }}</div> <button @click="hdClick">按钮</button> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; let props = defineProps({ num: { type: Number, default: 100 } }) const emit = defineEmits<{ // update:固定写法,后面的变量是父组件中v-model:后面的这个变量 (event: 'update:num', n: number): void }>() let n = ref(props.num) const hdClick = () => { // emit(上面event的值,要修改成的值) emit('update:num', n.value+=10) } </script> <style scoped></style>
效果图:
2、使用v-bind+emit
说明:v-bind非双向数据绑定,子组件传来的数据需要进行赋值。
2.1父向子传递数据
1.父组件引入子组件;
2.使用v-bind
l绑定一个引入子组件的属性(如:num);
3.子组件中使用defineProps
接收。
2.2子向父传递数据
1.声明defineEmites
;
2.在defineEmits
中声明(event: 'fn', n: number): void
;
3.进行事件触发执行emit('fn',num3.value)
4.父组件中@fn
对应的chanNum
接收参数并赋值。
代码示例:
// 父组件 <template> <div> <!-- 父组件 --> <p>{{ num1 }}</p> <p>{{ num3 }}</p> <button @click="add">父按钮</button> <Child :num="num1" @fn="chanNum"></Child> </div> </template> <script setup lang="ts"> import Child from "./11-AppChild.vue"; import { ref } from "vue"; let num1 = ref(10) let num3 = ref(0) const chanNum = (num33:number) => { num3.value=num33 } const add = () => { num1.value++ } </script> <style scoped></style>
// 子组件 <template> <div> <!-- 子组件 --> <p>{{ num }}</p> <p>{{ num3 }}</p> <button @click="hdClick">按钮</button> </div> </template> <script setup lang="ts"> import { ref } from "vue"; defineProps({ num: { type: Number, default: 30 } }) let num3=ref(30) // 子传父的时候需要先定义好emit这个方法 const emit = defineEmits<{ //fn为父组件引入子组件是定义的子组件事件属性,可随意定义 (event: 'fn', n: number): void }>() const hdClick = () => { // vue2通过$emit("自定义事件名",参数) num3.value+=2 emit('fn',num3.value) } </script> <style scoped></style>
效果图:
总结
- 父向子组件传参两中方式并没有太大区别,只是在引用子组件声明属性的时候一个是v-model一个是v-bind,在接收参数的时候则完全相同。
- 对于子组件向父组件传参则大为不同,v-model方式下父组件仅能单调的接收子组件传来的参数不能对传来的数据进行任何操作。除非单独另写逻辑进行处理。而v-bind方式下父组件在接收到子组件传来参数的同时能在声明的方法中对传来的数据和父组件本身的数据进行任意处理。
以上就是Vue3+Ts实现父子组件间传值的两种方式的详细内容,更多关于Vue3+Ts父子组件间传值的资料请关注脚本之家其它相关文章!
相关文章
Element-UI介绍主题定制、自定义组件和插件扩展的代码示例
本文介绍了使用Element-UI实现主题定制、自定义组件和扩展插件的方法和实用案例,在开发过程中,我们可以根据自己的需求,灵活选择相关的技术手段,并不断探索和尝试,以提高开发效率和用户体验,感兴趣的朋友跟随小编一起看看吧2024-02-02electron-vue+electron-updater实现自动更新(步骤源码)
这篇文章主要介绍了electron-vue+electron-updater实现自动更新,步骤源码包括autoUpdater.js操控更新js文件,main.js也就是package.json内的main指向的js文件,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-10-10
最新评论