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.…

C#引用C++dll

参考&#xff1a;C#调用C的dll方法_c#调用cdll-CSDN博客 _stdcall与_cdecl区别 (QT 加载MFC的dll时&#xff0c;要注意的"_stdcall"或者CALLBACK的问题)_qt stdcall-CSDN博客 c#调用c的DLL的实现方法_C#教程_脚本之家 首先Cdll的制作 不论是使用Cbuilder还是vs…

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

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

c1月考测试

文章目录 月考技能2月1.某场100公里加速时间比赛中有摩托车&#xff0c;汽车&#xff0c;飞机等&#xff0c;现定义一个Runner类为参赛者,Runner类中增加成员变量加速时间acc_time,现要求使用Runner类实例化motor&#xff0c;car,airplane三个对象&#xff0c;输出比赛的第一名…

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;线下商场基本不去。…

身份证联网核查接口 Android身份证实名认证接口调用 二要素核验接口

身份证核验也就是核查身份证的真实性&#xff0c;虽然现有的技术越来越强&#xff0c;但是利益驱使下&#xff0c;不法分子也在想尽各种办法来利用非真实的身份证来实施违法行为。翔云身份证核验接口就可随时为用户提供核查身份证真伪的接口&#xff0c;让实名认证政策落地。 以…

实验二-写一个主程序来上机设计并验证线性表顺序表示的所有操作(至少包含算法2.3、2.4、2.5),并设计一个算法删除所有值大于min而且小于max的元素。

废话不多说&#xff0c;数据结构自己写代码见识了太多的bug&#xff0c;看来还是自己写代码的功夫不到家啊&#xff0c;进入正题。直接上代码。 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 #define ERROR 0 #define OK 1 typedef int ElemType;…

维修住友注塑机 Sumitomo SE50D 工业液晶屏 SE50S工业电脑显示屏

Sumitomo (SHI) Demag 的 NC5 plus 控制器是一款易于使用的控制器&#xff0c;可帮助成型商实现卓越的注塑成型精度。 该控制器作为用户和注塑机之间的通信接口发挥着关键作用。只有通过控制才能访问机器的全部性能属性&#xff0c;从而以各种方式帮助最大限度地提高生产效率。…

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

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

tcp 连接数上限突破

连接数上限条件 文件句柄的限制 一个tcp连接就需要占用一个文件描述符&#xff0c;一旦文件描述符用完&#xff0c;新的连接就会返回给我们错误是&#xff1a;Can’topen so many files。linux系统出于安全角度的考虑&#xff0c;在多个维度对于可打开的文件描述符进行了限制…

unityAB包管理(远程下载)

1.AB包生成脚本 using UnityEngine; using UnityEditor; using System.IO; using System; using System.Collections.Generic;/// <summary> /// AB包创建 /// </summary> public class CreateAssetBundles : MonoBehaviour {public static string BuildAssetBund…

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;…

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

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

轻松上手MacOS:HomeBrew安装全指南

轻松上手MacOS&#xff1a;HomeBrew安装全指南 你是否曾为在MacOS上安装软件而烦恼&#xff1f;是否想要一个既强大又简单的包管理器来简化你的安装过程&#xff1f;HomeBrew正是你所需要的工具。作为MacOS上的包管理器&#xff0c;HomeBrew让安装软件变得像数123一样容易。在…

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

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

GettingStartedwithLLVMCoreLibraries书籍

Getting Started with LLVM Core Libraries 参考1 LLVM是构架编译器(compiler)的框架系统&#xff0c;以C编写而成&#xff0c;用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)&#xff0c;对开…