Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【BlogAdmin升级3】组件通讯与引用

【BlogAdmin升级3】组件通讯与引用

作者头像
老张的哲学
发布于 2024-02-22 07:40:36
发布于 2024-02-22 07:40:36
13300
代码可运行
举报
文章被收录于专栏:NetCore 从壹开始NetCore 从壹开始
运行总次数:0
代码可运行

父传子

1.父组件中给子组件绑定属性

2.子组件内部通过props选项接收

子传父

1.父组件中给子组件标签通过@绑定事件

2.子组件内部通过emit方法触发事件

子组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
// 由于写setup,所以无法直接配置props选项
// 所以需要借助"编译器宏"函数接收父组件传递的数据
const props = defineProps({
    car: String,
    money: Number,
    addMoney: Function
})
console.log(props.car)




//子传父
const emit = defineEmits(['change-Money'])
const buy = () => {
    emit('change-Money', 5)
}
</script>
<template>
    <div class="son">
        <!-- 子组件可以直接使用传递过来的数据 -->
        我是子组件 - {{ car }} - {{ money }} - <button @click="addMoney">+1</button>
        <div>  <button @click="buy">-Money</button></div>
    </div>
  
</template>
<style>
.son {
    border: 1px solid #000;
    padding: 30px;
}
</style>

父组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
//父传子
// 1.给子组件,添加属性方式传值
// 2.子子组件,通过props接收
import mychild from '@/components/mychild.vue'


// 传递动态值
import { ref } from 'vue';
const money = ref(100)


const addMoney = () => {
  money.value++
}




//子传父
// 1.在子组件内部,emit触发事件
// 2.在父组件通过@监听
const changeFn = (m) => {
  money.value -= m
}
</script>


<template>
  <div>
    父组件 - {{ money }} - <button @click="addMoney">+1</button>
    <mychild car="我是父组件传过来的参数" :money="money" :addMoney="addMoney" @change-Money="changeFn"></mychild>
  </div>
</template>

defineProps原理: 就是编译阶段的一个标识,实际编译器解析时,遇到后就会进行编译转换

模板引用

通过ref标识获取真实的dom对象或者组件实例对象

1.调用ref函数生成一个ref对象

2.通过ref表示绑定ref对象到标签

defineExpose()

默认情况下<script setup>语法糖下组件的属性和方法是不开放给父组件的

可以用过defineExpose编译宏指定哪些属性和方法允许访问

子组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
const count = 999
const sayHi = () => {
    console.log("你好")
}
defineExpose({
    count,
    sayHi
})
</script>
<template>
    <div>
        我是子组件 - {{ 999 }}
    </div>
</template>

父组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import myRefChild from '@/components/my-ref-child.vue'
import { ref, onMounted } from 'vue';
// 模板引用,可以获取dom,也可以获取组件
// 1.调用ref函数,生成一个ref对象
// 2.通过ref标识进行标定
// 3.通过ref对象.value即可访问到绑定的元素(必须渲染后才能拿到)
const myInput = ref(null)


onMounted(() => {
  console.log("myInput")
  // myInput.value.focus()
})


const clickFn = () => {
  myInput.value.focus()
}




const myChild = ref(null)


const getMyDom = () => {
  console.log(myChild.value)
  myChild.value.sayHi()
}
onMounted(() => {
  console.log(myChild.value)


})
</script>


<template>
  <div>
    <input ref="myInput" type="text" />
    <button @click="clickFn">点击输入聚焦</button>


    <div>
      <myRefChild ref="myChild"></myRefChild>
      <button @click="getMyDom">获取组件信息</button>
    </div>
  </div>
</template>

provide和inject

顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信

底层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>


import { inject } from 'vue';


const themeColor = inject('theme-color')


const count = inject('count')
const changeCount = inject('changeCount')
const changeFn = () => {
    changeCount(1000)
}
</script>
<template>
    <h3>我是底层组件 - {{ themeColor }} - {{ count }}</h3>
    <button @click="changeFn">更新count</button>
</template>

中间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import childBottom from '@/components/child-bottom.vue'
</script>
<template>
    <h2>我是中间组件</h2>
    <childBottom></childBottom>
</template>

顶层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import childCenter from '@/components/child-center.vue'


import { provide, ref } from 'vue';


// 跨层传递普通数据
provide('theme-color', 'pink')


// 跨层传递响应式数据
const count = ref(100)
provide('count', count)


setTimeout(() => {
  count.value = 200
}, 2000);


//跨层级传递函数,方便子组件修改父组件的数据,提供方法进行修改
provide('changeCount', (newCount) => {
  count.value = newCount
})
</script>
<template>
  <h1>我是顶层组件 - {{ count }}</h1>
  <childCenter></childCenter>
</template>

defineOptions(vue 3.3)

有<script setup>之前,如果要定义 props,emits 可以轻而易举地添加一个与 setup 平级的属性

但是用了<script setup> 后,就没法这么干了 setup 属性已经没有了,自然无法添加与其平级的属性

为了解决这一问题,引入了 defineProps 与 defineEmits 这两个宏。

但这只解决了 props 与emits 这两个属性如果我们要定义组件的 name 或其他自定义的属性,

还是得回到最原始的用法一再添加一个普通的<script>标签这样就会存在两个<script> 标签。

让人无法接受

所以在 Vue 3.3 中新引入了 defineOptions 宏。

顾名思义,主要是用来定义 Options API 的选项。可以用define0ptions定义任意的选项,props,emits,expose, slots 除外(因为这些可以使用 defineXXX来做到)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


// <script>
// export default {
//   name: "test"
// }
// </script>


<script setup>
defineOptions({
  name: 'test'
})
</script>
<template>
  <div>Hello</div>
</template>

defineModel

在Vue3中,自定义组件上使用v-model,相当于传递一个modelValue属性,同时触发 update:modelvalue 事件<Child v-model="isVisible">

相当于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Child :modelValue="isVisible" @update:modelValue="isVisible=$event">

我们需要先定义props,

再定义emits。其中有许多重复的代码。

如果需要修改此值,还需要手动调用 emit 函数

子组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import { defineModel } from 'vue';
const modelValue = defineModel()
const changeFn = () => {
    modelValue.value += 1
}
</script>
<template>
    <div>
        <input type="text" :value="modelValue" @input="e => modelValue = e.target.value" />
        {{ modelValue }}
        <button @click="changeFn">子组件更新</button>
    </div>
</template>

父组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import { ref } from 'vue';
import myInput from '@/components/my-input.vue'


const count = ref(100)


const changeFn = () => {
  count.value += 1
}
</script>
<template>
  <div>
    <myInput v-model="count"></myInput>
    <div>{{ count }} - <button @click="changeFn">父组件更新</button></div>
  </div>
</template>

Pinia

Pinia是Vue 的最新状态管理工具,是Vuex的替代品

特点

1.提供更加简单的API (去掉了 mutation )

2.提供符合,组合式风格的API (和Vue3 新语法统一)

3.去掉了 modules 的概念,每一个 store 都是一个独立的模块

4.配合TypeScript 更加友好,提供可靠的类型推断

配置

手动添加Pinia到Vue项目

在实际开发项目的时候,关于pinia的配置,可以在项目创建时自动添加现在我们初次学习,从零开始:

1使用 Vite 创建一个空的 Vue3 项目

npm create vue@latest

2按照官方文档安装 pinia 到项目中

Pinia基础使用 - 计数器案例

1.定义store

2.组件使用store

实现步骤

引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


import { createApp } from 'vue'
import persist from 'pinia-plugin-persistedstate'
import { createPinia } from 'pinia'
const pinia = createPinia(); //创建pinia实例
//导入pinia持久化插件
pinia.use(persist)


import App from './App.vue'


createApp(App).use(pinia).mount('#app')

定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineStore } from "pinia";
import { ref } from "vue";
import { computed } from 'vue';
//定义store
// defineStore(仓库唯一标识,()=>{...})


export const useCounterStore = defineStore("counter", () => {
  //声明数据 state - count
  const count = ref(100)
  //声明操作数据的方法 action(普通函数)
  const addCount = () => {
    count.value++
  }
  const subCount = () => {
    count.value--
  }
  //声明基于数据派生的计算属性 getters(计算属性computed)
  const double = computed(() => count.value * 2)
  //声明数据 state - msg
  const msg = ref("hello pinia")


  return {
    count,
    msg,
    addCount,
    subCount,
    double
  }
}, {
  //persist: true //开启持久化
  persist:{
      key:'自定义持久化key',
      paths:['count'] //定义某个变量持久化
  }
)

使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>


import Son1 from './components/Son1.vue';
import Son2 from './components/Son2.vue';


import { useCounterStore } from '@/store/counter.js'
const counterStore = useCounterStore();






console.log(counterStore)
</script>


<template>
  <h1>{{ counterStore.count }}</h1>
  <h1>{{ counterStore.msg }}</h1>
  <son-1></son-1>
  <son-2></son-2>
</template>


<style scoped></style>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 NetCore 从壹开始 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue 3 组件通信方式总结
子组件接收父级自定义属性则与vue2不同,vue2中是以props 配置项来接收,vue3 中则需要 用到宏函数 defineProps类接收
iwhao
2024/07/24
2900
Vue3 过10种组件通讯方式
众所周知,Vue.js 中一个很重要的知识点是组件通信,不管是业务类的开发还是组件库开发,都有各自的通讯方法。
德育处主任
2022/04/17
2K0
Vue3 过10种组件通讯方式
前端系列15集-watch,watchEffect,eventBus
watchEffect,它立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。
达达前端
2023/10/08
5340
VUE3全家桶精讲
有 <script setup> 之前,如果要定义 props, emits 可以轻而易举地添加一个与 setup 平级的属性。
HelloWorldZ
2024/03/20
2870
VUE3全家桶精讲
Vue3, setup语法糖、Composition API全方位解读
支持绑定多个v-model,v-model 是 v-model:modelValue 的简写
yyds2026
2022/09/26
3.2K0
7个 Vue3 中的组件通信方式
本文采用<script setup />的编写方式,比options API更自由。然后我们会讲以下七种组件通信方式:
唐志远
2022/10/27
7510
7个 Vue3 中的组件通信方式
Vue3如何优雅的跨组件通信🚀🚀🚀
开发中经常会遇到跨组件通信的场景。props 逐层传递的方法实在是太不优雅了,所以今天总结下可以更加简单的跨组件通信的一些方法。
萌萌哒草头将军
2023/11/12
8270
Vue3如何优雅的跨组件通信🚀🚀🚀
【Vuejs】738- 一篇文章上手Vue3中新增的API
作者: liulongbin http://www.liulongbin.top:8085/#/?id=_3-setup 1. 初始化项目 // ① npm i -g @vue/cli // ② vu
pingan8787
2020/10/23
8070
【Vuejs】738- 一篇文章上手Vue3中新增的API
【Vuejs】1286- 分享 15 个 Vue3 全家桶开发的避坑经验
最近入门 Vue3 并完成 3 个项目,遇到问题蛮多的,今天就花点时间整理一下,和大家分享 15 个比较常见的问题,基本都贴出对应文档地址,还请多看文档~ 已经完成的 3 个项目基本都是使用 Vue3 (setup-script 模式)全家桶开发,因此主要分几个方面总结:
pingan8787
2022/04/14
6.5K0
【Vuejs】1286- 分享 15 个 Vue3 全家桶开发的避坑经验
学习 Vue 3 全家桶 - 组件化
如 <button> 是浏览器封装好的组件,Vue 支持自定义组件,把一个功能的模板(template)封装在一个 .vue 文件中,方便在项目中复用整个组件的代码。
Cellinlab
2023/05/17
4260
学习 Vue 3 全家桶 - 组件化
Vue 3 + TypeScript 组件封装艺术:从原理到实践
在现代前端开发中,组件化开发已成为主流模式。Vue 3 配合 TypeScript 的组合,为我们提供了更强大的类型系统和更优秀的开发体验。本文将深入探讨如何基于 Vue 3 和 TypeScript 进行高质量的组件封装,并通过实际案例展示最佳实践。
编程小白狼
2025/04/26
2020
Vue3从入门到精通(二)
在Vue3中,侦听器的使用方式与Vue2相同,可以使用watch选项或$watch方法来创建侦听器。不同之处在于,Vue3中取消了immediate选项,同时提供了新的选项和API。
明志德道
2023/10/21
4730
Vue 组件间通信的几种方式
Vue 遵循单向数据流的原则,状态会从父组件传递给子组件,避免子组件意外改变父组件状态导致的混乱逻辑。
前端西瓜哥
2022/12/21
2K0
Vue3组件通信相关的知识梳理
我们知道vue3的Composition Api是它几个最大亮点之一,所以下文都是在setup中演示代码的实现。后面会以开发几个简单form组件为例子来演示。
前端达人
2021/08/10
3.7K0
Vue3组件通信相关的知识梳理
vue3简易入门剖析
,发音同 “veet”)是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:
张哥编程
2024/12/13
4250
Pinia:Vue3中的新宠,轻松上手教程!
Vue3是Vue3是一款非常流行的JavaScript框架,它的出现为我们开发Web应用程序提供了更加高效和便捷的方式。在Vue3中,我们可以使用Pinia来进行状态管理,这是一个非常流行的状态管理库,它可以帮助我们更好地组织和管理应用程序的状态。在本文中,我们将探讨如何使用Vue3和Pinia,并持久化处理。
Front_Yue
2024/01/11
5600
Pinia:Vue3中的新宠,轻松上手教程!
总结vue3中常用的组件间通信的方法
这也是面试经常问到的一道题,正好近期刷到这道题, 然后就写写小demo,顺便将父子组件通信,兄弟组件通信, 跨组件通信, 总结复习一下.
心安事随
2024/07/29
1660
总结vue3中常用的组件间通信的方法
一文看完vue3的变化之处
之前在非组件的情况下创建实例可以使用对象,但是现在所有情况下都只能使用一个返回对象的函数。
街角小林
2022/06/15
3.1K0
【Vue3+TypeScript】CRM系统项目搭建之 — 关于 VUE3 语法新变化
vite 是新一代前端构建工具,官网地址:https://vitejs.cn,vite的优势如下:
HelloWorldZ
2024/03/20
5400
【Vue3+TypeScript】CRM系统项目搭建之 — 关于 VUE3 语法新变化
一文掌握Vue3的组件&组件通信
在前端开发中,组件化就是“搭积木”——将页面功能拆分成一个个可复用的“积木块”,然后自由组合,快速搭建出各种炫酷的页面。
方才编程_公众号同名
2024/11/19
2310
一文掌握Vue3的组件&组件通信
相关推荐
Vue 3 组件通信方式总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验