vue3-组件传参及计算属性

​🌈个人主页:前端青山
🔥系列专栏:Vue篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来vue篇专栏内容:vue3-组件传参及计算属性

目录

vue3中的组件传参

1、父传子

2、子传父

toRef 与 toRefs

vue3中的计算属性

vue3 中的 watch监听器

vue3中的组件传参

组件关系:

父子 props、$panrent

子父 emit自定义事件 $children $refs

兄弟 eventbus中央事件总线 vue3如果需要实现eventbus 安装第三方库mitt

跨层级 provider inject

组件状态共享工具: vuex pinia

1、父传子

  • 在父组件中给子组件设置自定义属性 tit,将要传递的参数赋值给tit属性

<!--父组件  -->
<template><p></p><Testvue3 :tit="schoolName"><span>123</span></Testvue3>
</template>
​
<script>
import Testvue3 from "@/components/Testvue3";
export default {name: "App",components: { Testvue3 },setup() {let schoolName = "千锋"; // 定义要传给子组件的数据  return {schoolName, // 要使用的变量抛出去,这样就可以在页面模板中使用该变量};},
};
</script>
  • 在子组件中接收传过来的属性通过props ,这个和vue2 一样没有变化。

<!-- 子组件 -->
<template><p>{{ tit }}</p><button>点击事件,子传父</button>
</template>
​
<script>
export default {data() {return {};},props: ["tit"],setup(props) { // 参数props即为父组件传过来的参数console.log(props)return {//setup函数返回值为一个对象};},
};
</script>

2、子传父

  • 给子组件绑定自定义事件,然后在setup中定义该事件对应的方法,因为setup中没有this ,this为undefined,所以vue的开发者为了解决该问题,在setup中提供了2个形参,prop和context

    • props 为父传子的参数

    • context 上下文对象,里面有emit 方法,可以实现子传父

  • 子组件中多了 emits选项,该选项类似于props,接收父组件给子组件绑定的自定义方法,如果不加该选项,vue3 会提示警告。但不影响功能

<!-- 子组件 -->
<template><p>{{ tit }}</p><button @click="emit">点击事件,子传父</button>
</template>
<script>
import { reactive } from "vue";
export default {data() {return {};},emits: ["transfer"], // 在子组件中使用emits配置项,接收父组件给我绑定的自定义事件,用法类似于props,                       // 不加该配置项,控制台会提示警告setup(props, context) {console.log(11, props);console.log(22, context);// 定义方法function emit() {// 子传父 此处不用this,使用context上下文对象context.emit("transfer", 666);}return {//setup函数返回值为一个对象emit,};},
};
</script>
  • 在父组件接收自定义事件,该事件对应的执行函数的形参就是传过来的数据,这个就和vue2一样啦。

    <!--父组件  -->
    <template><p></p><Testvue3 @transfer="showdata"><span>123</span></Testvue3>
    </template>
    <script>
    import Testvue3 from "@/components/Testvue3";
    export default {name: "App",components: { Testvue3 },setup() {function showdata(value) {console.log(value);}return {showdata,};},
    };
    </script>

    toRef 与 toRefs

    定义:toRef 创建一个ref 响应数据

    语法:let name = toRef(person,'name') 将响应对象person中的name属性单独拿出来变成响应属性。

    应用:一般用于将响应对象中的某个属性单独提供给外部使用

  • 如下是使用toRef 前的代码: 插值表达式模板中的 person 有点繁琐

  • <!-- 子组件 -->
    
    <template><div><p>{{ person.name }} -- {{ person.age }} -- {{ person.job.type }} --{{ person.job.salary }}</p></div>
    </template>
    ​
    <script>
    import { reactive } from "vue";
    export default {setup() {let person = reactive({name: "张三",age: 20,job: {type: "web前端开发",salary: 30,},});return {person,};},
    };
    </script>

  • 如下是使用toRef 后 的代码,

  • <!-- 子组件 -->
    
    <template><div><p><!-- 在模板中直接使用name,age,type,salary -->{{ name }} -- {{ age }} -- {{ type }} --{{ salary }}</p><p><button @click="name += '-'">修改name</button><button @click="salary++">修改薪水</button></p></div>
    </template>
    ​
    <script>
    import { reactive, toRef } from "vue";
    export default {setup() {let person = reactive({name: "张三",age: 20,job: {type: "web前端开发",salary: 30,},});// 将person 中的name 属性转换成ref 响应式数据,这样就可以直接在模板中使用了,以此类推let name = toRef(person, "name"); let age = toRef(person, "age");let type = toRef(person.job, "type");let salary = toRef(person.job, "salary");return {name,age,type,salary,};},
    };
    </script>
    <style scoped>
    /* @import url(); 引入css类 */
    </style>

  • 使用toRefs 可以将对象中的多个属性转换成响应数据,代码如下:

  • <!-- 子组件 -->
    
    <template><div><p>{{ name }} -- {{ age }} -- {{ job.type }} --{{ job.salary }}</p><p><button @click="name += '-'">修改name</button><button @click="job.salary++">修改薪水</button></p></div>
    </template>
    ​
    <script>
    import { reactive, toRefs } from "vue";
    export default {setup() {let person = reactive({name: "张三",age: 20,job: {type: "web前端开发",salary: 30,},});//toRefs返回一个响应对象,该对象中每个属性都变成了响应属性了。这样就可以直接拿来在模板插值表达式中使用了let person1 = toRefs(person);// console.log(person1);return {...person1, // 使用后扩展运算符展开对象};},
    };
    </script>
    <style scoped>
    /* @import url(); 引入css类 */
    </style>

    关于数据响应式设置的问题:

    1、如何设置一个响应式数据? ref reactive

    2、如何将非响应式数据转为响应式数据? toRef toRefs

    3、如何将数据设置为只读数据?不能够修改 readOnly

vue3中的计算属性

同vue2不同,使用计算属性需要引入computed 方法

<template><p>姓:<input type="text" v-model="data.firstname" /></p><p>名:<input type="text" v-model="data.lastname" /></p><p>姓名:<input type="text" v-model="data.fullname" /></p>
</template>
​
<script>
// 引入对应的计算属性方法
import { reactive, computed } from "vue";
export default {name: "App",setup() {let data = reactive({firstname: "",lastname: "",fullname: "",});// 计算属性--简写// data.fullname = computed(() => {//   return data.firstname + data.lastname;// });// 计算属性--完整写法data.fullname = computed({get() {return data.firstname + data.lastname;},set(value) {console.log(value);data.firstname = value.substr(0, 1);data.lastname = value.substr(1);},});return {data,};},
};
</script>

vue3 中的 watch监听器

vue3 中的watch 也是 组合式api中的一个方法,所以使用时,需要引入

<template><p>{{ sum }} <button @click="sum++">sum++</button></p><p>{{ fullname }} <button @click="fullname += '-'">修改姓名</button></p><p>{{ userinfo.name }}--{{ userinfo.age }}--{{ userinfo.job.type }}--{{userinfo.job.salary}}K<button @click="userinfo.age++">修改年龄</button><button @click="userinfo.job.salary++">修改薪水</button></p>
</template>
<script>
// 引入对应的计算属性方法
import { ref, watch, reactive } from "vue";
export default {name: "App",setup() {let sum = ref(0);let fullname = ref("张三");let userinfo = reactive({name: "李四",age: 20,job: {type: "web开发",salary: 20,},});//1、监听ref定义的响应式数据 immediate初始化就执行watchwatch(sum, (newvalue, oldvalue) => {console.log(newvalue, oldvalue);},{immediate:true});//2、 监听ref定义的多个响应式数据,immediate初始化就执行watchwatch([sum, fullname], (newvalue, oldvalue) => {console.log(newvalue, oldvalue);}, { immediate: true });
​//3、 监听reactive 定义的响应式数据// 注意:此处oldvalue 无效(新值与旧值一样),默认是深度监听,immediate初始化就执行watchwatch(userinfo,(newvalue, oldvalue) => {console.log(newvalue, oldvalue);},{ immediate: true });return {sum,fullname,userinfo,};},
};
</script>

watchwatchEffect 都能响应式地执行有副作用的回调。它们之间的主要区别是追踪响应式依赖的方式:

  • watch 只追踪明确侦听的数据源。它不会追踪任何在回调中访问到的东西。另外,仅在数据源确实改变时才会触发回调。watch 会避免在发生副作用时追踪依赖,因此,我们能更加精确地控制回调函数的触发时机。

  • watchEffect,则会在副作用发生期间追踪依赖。它会在同步执行过程中,自动追踪所有能访问到的响应式属性。这更方便,而且代码往往更简洁,但有时其响应性依赖关系会不那么明确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/213184.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杭州银行连接解决方案:集成CRM、用户运营和广告推广系统

自动化与智能化是企业新的增长引擎。在数字化时代&#xff0c;企业需要通过数字化工具来提高效率和效益&#xff0c;这也是杭州银行推出的连接解决方案的初衷。该解决方案集成了CRM、用户运营和广告推广系统&#xff0c;为企业提供全方位的数字化转型支持。 杭州银行连接解决方…

多功能回馈式交流电子负载的应用

多功能回馈式交流电子负载是用于模拟和测试电源、电池等电子设备的负载工具。它具有多种应用&#xff0c;可以用于测试和评估各种类型的电源&#xff0c;包括直流电源和交流电源。它可以模拟各种负载条件&#xff0c;如恒定电流、恒定电压和恒定功率&#xff0c;以验证电源的性…

WPF实战项目十六(客户端):备忘录接口

1、新增IMemoService接口&#xff0c;继承IBaseService接口 public interface IMemoService : IBaseService<MemoDto>{} 2、新增MemoService类&#xff0c;继承BaseService和IMemoService接口 public class MemoService : BaseService<MemoDto>, IMemoService{pub…

PC分页操作以及loading效果

page-size 每页显示条目个数 current-page 当前页数 total 数据总数 current-change【currentPage 改变时会触发】 切换分页时会先加载&#xff0c;等在接口数据&#xff0c;接口返回&#xff0c;加载会关闭&#xff08;在获取接口数据完毕哪里加上this.loadingfalse&#xff0…

掘金产业数字化,百望云荣登2023中国产业数字化新锐势力榜

日前&#xff0c;“第十届中国产业数字化大会”在南京盛大举行&#xff0c;百望云荣登“中国产业数字化新锐势力榜”&#xff0c;市场价值与方案能力再获认可&#xff01; 据悉共有50家企业登上榜单&#xff0c;本次会议作为“中国&#xff08;南京&#xff09;电子商务大会”的…

Linux-Ubuntu环境下搭建SVN服务器

Linux-Ubuntu环境下搭建SVN服务器 一、背景二、前置工作2.1确定IP地址保持不变2.2关闭防火墙 三、安装SVN服务器四、修改SVN服务器版本库目录五、调整SVN配置5.1查看需要修改的配置文件5.2修改svnserve.conf文件5.3修改passwd文件&#xff0c;添加账号和密码&#xff08;window…

九州未来联合联通智网科技发布白皮书,促进车联网融合发展

2023年11月21日&#xff0c;由2023中国5G工业互联网大会组委会、工业和信息化部主办&#xff0c;联通智网科技承办的2023中国5G工业互联网大会——5G车联网与智慧交通创新发展平行会议&#xff0c;在武汉成功举办。 九州未来作为中国联通车联网创新联合体成员单位&#xff0c;受…

【OpenCV实现图像:可视化目标检测框】

文章目录 概要画框函数代码实现标签美化角点美化透明效果小结 概要 目标检测框的可视化在计算机视觉和机器学习领域中是一项重要的任务&#xff0c;有助于直观地理解和评估目标检测算法的性能。通过使用Python和相关的图像处理库&#xff0c;可以轻松实现目标检测框的可视化。…

线性空间(也叫向量空间)、线性运算

线性空间、线性运算 线性空间&#xff0c;也称向量空间。 假设是一个非空集合&#xff0c;是一个实数域。 在中定义了一个加法&#xff1a;即对中任何两个元素和&#xff0c;总有中另外一个元素与它们相对应&#xff0c;称为和的和&#xff0c;记作&#xff1a; 在定义了一个…

VINS-MONO代码解读----vins_estimator(重点部分)

1. 代码目录如下&#xff0c;重点和难点是factor部分&#xff0c;是关于IMU部分的&#xff0c;有较多关于IMU预积分公式的推导。 1. 条件变量con.wait读取测量值&#xff1a;getMeasurements() 读取buf中IMU和IMG的数据&#xff0c;并进行align&#xff0c;最后的结果是这样…

文章解读与仿真程序复现思路——电工技术学报EI\CSCD\北大核心《面向差异化电源成本结构的容量市场机制设计》

这个文章标题涉及到容量市场机制设计&#xff0c;着重考虑了电源成本结构的差异性。下面对标题中的关键词进行解读&#xff1a; 面向&#xff08;Facing&#xff09;&#xff1a; 表示该容量市场机制设计是以某种方向、取向或目标为基础的。在这里&#xff0c;可能指的是设计是…

Docker部署Vue+Springboot项目

一、部署Springboot项目 1.1先将本地的java项目打成jar包。 再右上角进行maven操作。 1.2将jar包上传到服务器当中。 先再目录/home 下创建一个文件夹&#xff08;classRoom&#xff09;用于存放后端打镜像时需要的文件。 如果是服务器的话可以直接将文件拖拽到想要转移的地方…