Vue3组件详情

Vue3组件详情

  • 一、父组件向子组件传值 ref、props
  • 二、子组件向父组件传值 emit
  • 三、子组件向父组件传值 v-model
  • 四、setup语法糖
    • 1、基本用法
    • 2、data和methods
    • 3、计算属性 computed
    • 4、监听器 watch、watchEffect
    • 5、自定义指令 directive
    • 6、import导入的内容可以直接使用
    • 7、声明props和emit
    • 8、父组件获得子组件的数据(等同于Vue2.0中的$ref)
    • 9、provide和inject传值
    • 10、对await异步支持
    • 11、nextTick
    • 12、全局属性 globalProperties
    • 13、与普通< script >标签一起使用
    • 14、v-memo新指令
  • 五、Vue3生命周期

一、父组件向子组件传值 ref、props

// 父组件
<Son :showDialogVisible="showDialogVisible" />
<script>
import {defineComponent,ref} from 'Vue';
setup(){const showDialogVisible=ref(true);return {showDialogVisible}
}
</script>
<script>
// 子组件
import {defineComponent,ref} from 'Vue';
export default defineComponent({name:"",props:{showDialogVisible:Boolean},setup(props){return {props}}
})
</script>

二、子组件向父组件传值 emit

子组件中:
由于Vue数据传递时单向数据流,子组件没有权利修改父组件传递过来的数据,只能用emit通知父组件去修改。

<script>// 子组件setup(props,context){context.emit('setShow',false)return;}...或者...setup(props,{emit}){emit('setShow',false)return;}
</script>
// 父组件
<Son :showDialogVisible="showDialogVisible"@setShow="setShowDialogVisible" />
<script>
import {defineComponent,ref} from 'Vue';
setup(){const showDialogVisible=ref(true);const setShowDialogVisible=(bool)=>{showDialogVisible=bool;}return {showDialogVisible,setShowDialogVisible}
}

三、子组件向父组件传值 v-model

如果子组件向父组件传的值正好是父组件向子组件传的值,可以直接在该属性上进行双向绑定。

// 子组件
// 直接修改从props中拿到的数据;context.emit('update:showDialogVisible',false)
</script>
// 父组件
<Son v-model:showDialogVisible="showDialogVisible"/>
<script>

四、setup语法糖

在vue2.0时期,组件里定义的各类变量,方法,计算属性等是分别放到data,methods,computed选项里。

setup是vue3.0后推出的语法糖,按需引入computed,watch,directive等,一个业务逻辑可以编写在一起,让代码更加简洁便于浏览。

1、基本用法

<script setup>console.log('Hello World');
</script>

只需在 < script > 里添加一个setup属性,编译时会把 < script setup> < / script >里的代码编译成一个setup函数。
普通的 < script > 只会在组件被首次引入的时候执行一次,< script setup> 里的代码会在每次组件实例被创建的时候执行。

2、data和methods

< script setup> 里声明的变量和函数,不需要return暴露出去,就可以直接在template使用。

<script setup>import {ref,reactive} from 'vue';const msg = "Hello World";//普通变量// 响应式变量let num = ref(11); //ref 声明基本变量类型const obj = reactive({//reactive 声明对象类型变量:Object,Array,Datekey:"this is a object"})function getName(){}
</script>

3、计算属性 computed

<script setup>import {ref,computed} from 'vue';let num = ref(0); const countPlus = computed(()=>{return num.value+1;})
</script>

4、监听器 watch、watchEffect

// watch
<script setup>import {ref,reactive,watch} from 'vue';// 监听reflet num = ref(0); watch(num,(newval,oldval)={// ...})// 监听reactiveconst obj = reactive({key:"this is a object"})watch(obj.key,(newval,oldval)={// ...},{immediate:true,// 立即执行,默认falsedeep:true,//深度监听,默认false})const onChange = function () {num.value++;obj.key="this change"}
</script>

watchEffect :Vue3.0新增的监听属性的方法,与watch的区别在于,watchEffect不需要指定监听对象,回调函数里可直接获取到修改后的属性的值。

<script setup>import {ref,reactive,watchEffect} from 'vue';let num = ref(0); const obj = reactive({key:"this is a object"})setTimeout( ()=> {num.value++;obj.key="this change"})watchEffect((newval,oldval)=>{console.log("修改后的count",count.value);console.log("修改后的obj",obj.key);})
</script>

5、自定义指令 directive

以vNameDirective的形式来命名本地自定义指令,可以直接在模板中使用。

<template><h1 v-my-directive>今天的日记</h1>
</template>
<script setup>
// 导入指令可重命名
// import {myDirective as vMyDirective} from './MyDirective.js'
// 自定义指令
const vMyDirective={beforeMount:(el)=>{// 元素上做一些操作}
}
</script>

6、import导入的内容可以直接使用

导入的模快内容,不需要通过method来暴露它;
导入外部组件,不需要通过components注册使用;

7、声明props和emit

// Child.vue
<template><h1>信息:{{info}}</h1><el-button @click="onChange">点击</el-button>
</template>
<script setup>
import {defineProps,defineEmits} from 'vue';
// 声明Props
const props =defineProps({info:{type:String,default:""}
})
// 声明Emits
const $emit = defineEmits(['changeInfo']);
const onChange=function(){$emit('changeInfo','child返回值')
}
</script>
// Parent.vue
<template><Child :info="msg" @changeInfo="onAction"></Child>
</template>
<script setup>
import {ref} from 'vue';
import Child from './Child.vue'
const onAction=function(event){console.log(event);
}
</script>

8、父组件获得子组件的数据(等同于Vue2.0中的$ref)

父组件想要通过ref获取子组件的变量或函数,子组件须使用defineExpose暴露出去。

// Child.vue
<script setup>import {ref,define} from 'vue';const info = ref('I am child');const onChange = function(){console.log('')};defineExpose({info,onChange})
</script>
// Parent.vue
<template><Child ref="childRef"></Child><el-button @click="onAction">点击</el-button>
</template>
<script setup>import {ref} from 'vue';import Child from './Child.vue'const childRef = ref();const onAction = function(){console.log(childRef.value.info)console.log(childRef.value.onChange());};
</script>

9、provide和inject传值

无论组件层次结构有多深,父组件都可以通过provide选项来为其所有子组件提供数据。

// Parent.vue
<template><Child></Child>
</template>
<script setup>import {ref,provide} from 'vue';import Child from './Child.vue'
const msg = ref('Hello,my son');
const onShow = function(){...};
provide('myprovide',{msg,onShow})
</script>
// Child.vue
<template><el-button @click="getDate">点击获取父组件的值</el-button>
</template>
<script setup>import {inject} from 'vue';const provideState = inject('myProvide');const getDate = function(){console.log(provideState.msg);console.log(provideState.onShow());}
</script>

10、对await异步支持

< script setup>中可以使用顶层await,结果代码会被编译成async setup()。例子:

<script setup>const post = await fetch('/api/post/tabledata').then(res=>{})
</script>

11、nextTick

//方式一
<script setup>
import {nextTick} from 'vue';
nextTick(()=>{});// Dom已更新
</script>
//方式二
<script setup>
import {nextTick} from 'vue';
await nextTick();// nextTick是一个异步函数,返回一个Promise实例
</script>

12、全局属性 globalProperties

// main.js
import {createApp} from 'vue';
import App from './App.vue';
const app = createApp(App);
// 定义一个全局属性
app.config.globalProperties.global="全局属性";
app.$mount("#app");
<script setup>
//组件内使用
import {getCurrentInstance} from 'vue';
const { proxy } = getCurrentInstance();//获取Vue实例
console.log(proxy.$global);//输出
</script>

13、与普通< script >标签一起使用

可以与普通< script>标签一起使用,但是以下一些情况不会使用到:
①无法在<script setup>声明的选项 ,例如inheritAttrs 或通过插件启用的自定义的选项;
②声明命名导出,< script setup >定义的组件果默认以文件各作为组件名.
③运行副作用或者创建只需要执行一次的对象

< script >
//普通< script >,在模块范围下执行(只执行一次)runSideEffectOnce();
// 声明额外的选项
export default {name :'ComponentName ',//组件重命名inberitAttrs:false ,customOptons:{}
}
</ script ><script setup )
//在 setup ()作用域中执行(对每个实例皆如此)
<script)

14、v-memo新指令

该指令与 v - once 类似, v - once 是只渲染一次之后的更新不再渲染,而 v - memo 是根据条件来渲染。该指令接收一个固定长度的数组作为依赖值进行记忆对比,如果数组中的每个值都和上次渲染的时候相同,则该元素(含子元素)不刷新。
①应用于普通元素或组件

< template >
< div v-meno ="[valueA ,valueB]"></ div >//普通元素
< component v-memo ="[valueA , valueB]"></ component >//组件
< /template >< script setup )import component from ".../components/component.vne "
< /script >```

当组件重新渲染的时候,如果 valueA 与 valueB 都维持不变,那么对这个< div >以及它的所有子节点的更新都将被跳过。
②结合 v - for 使用
v - memo 仅供性能敏感场景的针对性优化,会用到的场景应该很少。渲染 v - for 长列表(长度大于1000)可能它是最有用的场景:

< template >< div v-for =" item in list " :key =" item.id " v-memo ="[ item.id == selected ]">< p > ID : {{item.id}}-selected : {{item.id == selected}}< /p >< / div>
</ template >

当 selected 发生变化时,只有 item . id === selected 的该项重新渲染,其余不刷新。

五、Vue3生命周期

请添加图片描述

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

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

相关文章

Flume集成Kafka

之前提到Flume可以直接采集数据存储到HDFS中&#xff0c;那为什么还要引入Kafka这个中间件呢&#xff0c;这个是因为在实际应用场景中&#xff0c;我们既需要实时计算也需要离线计算。 Kfka to HDFS配置 # Name the components on this agent a1.sources r1 a1.sinks k1 a1.…

动态规划7,等差数列划分,湍流子数组,唯一的子字符串,最长递增子序列

等差数列划分 思路&#xff1a; 经验题目要求 dp[i]表示&#xff1a;以 i 位置为结尾的所有子数组中有多少个等差数列 状态转移方程 对 dp[i] 位置&#xff0c;数列至少有三个元素&#xff0c;如果相邻三个为等差数列&#xff0c;dp[i] dp[i-1] 1; 如果相邻三个不为等差数…

windows批处理脚本(cmd指令)

一、简介 最早期的电脑系统是DOS系统&#xff0c;DOS系统只有一个黑漆漆的窗口&#xff0c;需要自己输入命令&#xff0c;所以学习命令是很有必要的&#xff0c;那么CMD命令大全是什么?直到今天的Windows系统&#xff0c;还是离不开DOS命令的操作。如今懂得使用windows批处理脚…

【AI绘画教程】AI绘画图生图怎么用?

AI绘画技术已经越来越成熟&#xff0c;越来越多的人开始尝试利用AI进行创作。而AI绘画图生图作为一款优秀的AI绘画工具&#xff0c;正是帮助许多人创作的好帮手。 AI绘画图生图功能可以通过多种软件实现&#xff0c;具体的操作步骤可能因软件而异&#xff0c;但大体流程相似。以…

基于springboot+vue的会议室预约系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 随着互联网技术的发展&#xff0c;各行各业乃至人们的衣食住行都离不开网络。就拿最普普通通的衣食住行来说吧&#xff0c;穿衣服、买衣服我们现在基本都是在网络上进行购买&#xff0c;线下商场基本不去。…

1688商品详情数据采集(商品属性,规格,价格,详情图等)

京东商品详情数据采集是一个复杂但重要的过程&#xff0c;它涉及获取商品的详细信息&#xff0c;包括商品属性、规格、价格以及详情图等。以下是关于如何进行京东商品详情数据采集的基本步骤&#xff1a; 确定采集目标&#xff1a;首先&#xff0c;你需要明确需要采集的商品信…

ARM 汇编指令:(五)CMP指令

目录 1.CMP比较指令 2.指令条件码 cond 1.CMP比较指令 CMP指令是计算机指令集中的一种比较指令&#xff0c;用于比较两个操作数的大小关系或相等性&#xff0c;并根据比较结果设置或更新条件码寄存器&#xff08;或程序状态字&#xff09;的标志位。 指令格式&#xff1a;C…

VUE内盘期货配资软件源码国际外盘二合一

开发一个Vue内盘期货配资软件源码&#xff0c;同时兼容国际外盘二合一的功能&#xff0c;是一个复杂且专业的任务&#xff0c;涉及前端Vue.js框架的使用、后端服务器处理、数据库管理、实时交易接口对接等多个方面。下面是一些关于开发此类软件的基本指导和考虑因素&#xff1a…

什么是同城上门预约按摩系统,上门预约平台有哪些功能?

随着互联网技术的发展&#xff0c;人们的生活方式发生了很大的变化。在日常生活中&#xff0c;大家都习惯使用手机来订餐、购物、家政服务等&#xff0c;这也为我们的生活带来了很大的便利。而同城按摩小程序作为一种新兴的按摩预约方式&#xff0c;受到了越来越多人的欢迎。下…

机器视觉检测设备的组成要素

机器视觉检测设备是一种先进的自动化检测技术工具&#xff0c;它利用光学、图像处理和计算机硬件及软件技术模拟并扩展人类的视觉功能&#xff0c;以实现对产品或目标物体进行自动化的尺寸测量、缺陷检测、表面质量评估、颜色识别、形状匹配以及位置判断等功能。这种设备通常包…

c/c++| 常规 |sizeof 、strlen

总结来说 &#xff0c;sizeof 查看内存给对象分配的空间大小&#xff0c;不仅仅是普通的内置变量&#xff0c;还包括用户自定义变量、结构体、类对象 然后strlen 是查看字符串的实际长度大小&#xff0c;注意它不会计算那个结束符’\0’

重生奇迹MU攻击防御技能石哪里掉

在《重生奇迹MU》中&#xff0c;攻击和防御技能石可以从以下途径获得&#xff1a; 1.怪物掉落&#xff1a;你可以通过击败怪物获得攻击和防御技能石&#xff0c;不同的怪物掉落不同的石头。你可以在各个地图的怪物掉落表中查看特定怪物掉落的技能石。 2.商店购买&#xff1a;…

【教程】APP加固的那些小事

摘要 APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择…

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展&#xff0c;固态硬盘&#xff08;Solid State Drive&#xff0c;简称SSD&#xff09;已成为现代电脑的标配。相较于传统的机械硬盘&#xff0c;固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是&#xff0c;对于不熟悉电脑硬件的用户来说&#xff0…

3D地图在BI大屏中的应用实践

前言 随着商业智能的不断发展&#xff0c;数据可视化已成为一项重要工具&#xff0c;有助于用户更好地理解数据和分析结果。其中&#xff0c;3D地图作为一种可视化工具&#xff0c;已经在BI大屏中得到了广泛地应用。 3D地图通过将地理信息与数据相结合&#xff0c;以更加直观…

【Linux】Shell编程【一】

shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Shell属于内置的…

【C++ 学习】程序内存分布

文章目录 1. C 内存分布的引入 1. C 内存分布的引入 ① 栈又叫堆栈&#xff1a;非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 ② 内存映射段&#xff1a;是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存…

【知识库系统】使用SpringSecurity进行身份认证

一、理论知识部分 SpringSecurity 的官网文档地址&#xff1a;SpringSecurity 这里以24年3月份的 6.2.2 版本为例&#xff0c;记录一下学习过程。 1. SpringSecurity 是基于 Servlet Filters 的&#xff0c;而 Servlet Filters 中的流程如下&#xff1a;首先由客户端 Client…

时间复杂度中的log(n)底数是多少?

问题&#xff1a; 最近有好几学生问我&#xff0c;无论是计算机算法概论、还是数据结构书中&#xff0c; 关于算法的时间复杂度很多都用包含O(logN)这样的描述&#xff0c;但是却没有明确说logN的底数究竟是多少。 解答&#xff1a; 算法中log级别的时间复杂度都是由于使用了分…

关于stm32(CubeMX+HAL库)的掉电检测以及flash读写

1.掉电检测 CubeMX配置 只需使能PVD中断即可 但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数&#xff0c;我也通过HAL库进行编写 void PVD_config(void) {//配置PWRPWR_PVDTypeDef sConfigPVD; sConfigPVD.PVDLevel PWR_PVDLEVEL_7; …