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,Date
    key:"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';
  // 监听ref
  let num = ref(0); 
  watch(num,(newval,oldval)={
    // ...
  })
  // 监听reactive
  const obj = reactive({
    key:"this is a object"
  })
  watch(obj.key,(newval,oldval)={
    // ...
  },{
    immediate:true,// 立即执行,默认false
    deep: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.mfbz.cn/a/453217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】使用Docker部署IT运维管理平台CAT

作者怀揣着一个美好的愿景&#xff0c;旨在提升管理效率、推动开源项目的蓬勃发展。 来一杯咖啡与茶&#xff0c;为 IT 运维从业者减轻管理负担&#xff0c;提升管理效率&#xff0c;从繁重无序的工作中解压出来&#xff0c;利用剩余时间多喝一杯休息一下。 这是一个专为 IT 运…

英伟达推出免训练,可生成连贯图片的文生图模型ConsiStory,生成角色一致性解决新方案

目前&#xff0c;多数文生图模型皆使用的是随机采样模式&#xff0c;使得每次生成的图像效果皆不同&#xff0c;在生成连贯的图像方面非常差。 例如&#xff0c;想通过AI生成一套图像连环画&#xff0c;即便使用同类的提示词也很难实现。虽然DALLE 3和Midjourney可以对图像实现…

k8s+zabbix

一&#xff0c;环境&#xff1a; 1&#xff09;&#xff0c;k8s部署&#xff0c;master和node节点都部署成功 二&#xff0c;部署&#xff1a; 1&#xff09;&#xff0c;安装python3&#xff08;资源中有&#xff09; wget https://www.python.org/ftp/python/3.7.4/Python-…

【Python】新手入门学习:详细介绍组合/聚合复用原则(CARP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍组合/聚合复用原则&#xff08;CARP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集…

为什么选择VR全景进行企业宣传,如何将VR全景运用在企业展示

引言&#xff1a; 随着科技的不断发展&#xff0c;VR全景技术逐渐成为企业宣传的热门选择。那么&#xff0c;为什么越来越多的企业选择使用VR全景技术进行宣传呢&#xff1f; 一&#xff0e;为什么选择VR全景技术进行企业宣传 1. 提升用户体验 VR全景技术可以为用户营造身临…

c++函数SetConsoleTextAttribute

前言 正文 1.作用&#xff1a; 2.函数格式(重点)&#xff1a; 3.参数(重点)&#xff1a; 前言 实用(真的) 正文 1.作用&#xff1a; 更改cmd的背景色与字体颜色 2.函数格式(重点)&#xff1a; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),10进制参数); …

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

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

Java学习-Collection集合框架2

1.Set集合的特点 特点体验: 1.1 hashSet的底层实现-哈希表 以及特点 普通二叉树和二分查找树 二分查找树的缺点: 红黑树是什么? HashSet集合去重复的机制:(HashSet比较地址只要地址不同,就不算重复) 此时就需要重写Hashcode和equals方法了: 1.2linkedHashSet特点及底层原理 1.…

Apache SeaTunnel MongoDB CDC 使用指南

随着数据驱动决策的重要性日益凸显&#xff0c;实时数据处理成为企业竞争力的关键。SeaTunnel MongoDB CDC(Change Data Capture) 源连接器的推出&#xff0c;为开发者提供了一个高效、灵活的工具&#xff0c;以实现对 MongoDB 数据库变更的实时捕获和处理。 本文将深入探讨该连…

支付模块-01微信支付和支付宝支付接口调研

支付接口调研 一般情况下&#xff0c;一个网站要支持在线支付功能通常接入第三方支付平台&#xff0c;比如&#xff1a;微信支付、支付宝、其它的聚合支付平台 微信支付方式 支付方式描述应用场景付款码支付指用户展示微信钱包内的付款码给商户系统扫描后直接完成支付适用于线…

【嵌入式——QT】QPainter基本绘图

【嵌入式——QT】QPainter基本绘图 QPainter与QPaintDevicepaintEvent事件和绘图区QPainter主要属性QPen主要功能QBrush主要功能QPainter绘制基本图形方法图示代码示例 QPainter与QPaintDevice QPainter是用来进行绘图操作的类&#xff0c;QPaintDevice是一个可以使用QPainter…

力扣hot100题解(python版69-73题)

69、有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应…

YOLOv9改进策略:注意力机制 | EMA:基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;加入EMA注意力&#xff0c;一种基于跨空间学习的高效多尺度注意力&#xff0c;效果优于ECA、CBAM、CA等经典注意力。 yolov9-c-EMA summary: 970 layers, 51011154 parameters, 51011122 gradients, 238.9 GF…

链动2+1模式与用户留存复购策略:结合消费增值模式的创新应用

大家好&#xff0c;我是吴军&#xff0c;来自一家软件开发公司的产品经理岗位。 今天&#xff0c;我想和大家深入探讨链动21模式&#xff0c;特别是它如何有效应对用户留存和复购的挑战。 尽管有些人认为链动模式已经过时&#xff0c;但我认为它的潜力远未被充分挖掘。链动不仅…

SpringBoot3整合mybatis

SpringBoot3整合mybatis 一、添加mybatis的依赖二、通过XML配置三、通过yum或properties文件配置四、常用注解1.Mapper2.MapperScan 一、添加mybatis的依赖 <!--mybatis--> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>…

源聚达科技:抖音今年开店有没有什么新政策

随着电商行业的蓬勃发展&#xff0c;抖音平台作为新兴的社交电商平台&#xff0c;近年来推出了多项新政策以吸引商家入驻&#xff0c;提升用户体验。今年&#xff0c;抖音在开店政策上又有了新的调整和优化&#xff0c;这些变化对于商家来说无疑是重要的风向标。 最新的政策中&…

北京银行助力首批消费类公募REITs成功上市 担任嘉实物美消费REIT托监管行

3月12日&#xff0c;由北京银行担任托监管行并参与战配投资的嘉实物美消费REIT在上交所成功上市。这也让北京银行成为全国首家担任公募REITs托监管银行的城商行&#xff0c;亦是首家参与首批消费基础设施公募REITs战略投资的城商行&#xff0c;成功跻身商业银行综合服务公募REI…

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解 USART简介 USART是一种串行通信协议&#xff0c;广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式&#xff0c;因此它可以在没有时钟信号的情况下&#xff08;异步模式&#xff09;或有时钟信号的情况下&#xff08;同步模式&#xff…

Java项目:48 ssm008医院门诊挂号系统+jsp(含文档)

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本选题则旨在通过标签分类管理等方式实现 管理员&#xff1b;个人中心、药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管理、诊断…

如何解决word字体大小显示不一,部分文字无法显示/显式为空白?

问题重现 今天重启后打开word&#xff0c;显示如下&#xff1a; 从第1张图看&#xff0c;字体显示大小不同&#xff0c;第2张图&#xff0c;敲“满分”&#xff0c;无法显示“满”字&#xff0c;而且“分”的大小比一般字体要大。 我的解决方案 – 修复office 采用GPT的建议…