vue3中父子组件传值

学习参考地址:【精选】Vue3父子组件间传参通信_vue3父子组件传参-CSDN博客

1、父传子

父组件直接通过属性绑定的方式给子组件绑定数据,子组件通过defineProps接收函数接收,例如:

父组件中:

子组件中接收props:

子组件中使用props,直接打点调用

2、子传父

子组件传值给父组件主要是子组件通过defineEmits注册一个自定义事件,而后触发emit去调用该自定义事件,并传递参数给父组件。

在父组件中调用子组件时,通过v-on绑定一个函数,通过该函数获取传过来的值。

子组件:

// defineEmits不用引入 直接使用
const emit = defineEmits(["selectedListFn"]);
emit("selectedListFn", val);

父组件通过自定义函数接收:

3、子组件暴露属性给父组件defineExpose

子组件: 

父组件:通过给子组件添加ref 从而调用子组件的方法和属性

 4、依赖注入Provide/Inject

(针对多层嵌套的组件使用props传递会产生props逐级透传的问题)

 父组件:

使用provide函数向下传递值,第一个参数是注入名,第二个参数是传递的值

子组件:

通过inject函数接收父组件传递的值

第一个参数是父组件通过provide传递数据的注入名,第二个参数是父组件

孙组件:

而后无论哪个子组件想要获取toChildValue的值,只需使用inject即可

当提供 / 注入响应式的数据时,如果想改变数据时,建议尽可能将任何对响应式状态的变更都保持在供给方组件中,即根组件Root.vue。这样可以确保所提供状态的声明和变更操作都内聚在同一个组件内,使其更容易维护。

父组件:

子组件:

 

5、pinia 状态管理器

npm install pinia

npm i pinia 


main.js中引入:
import { createPinia } from 'pinia'
import { createApp } from 'vue'
import App from './App.vue'

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

src目录下创建store文件夹,用于存放store对应的js/ts文件,例如创建一个user.js文件

// @ts-check
import { defineStore } from 'pinia'

/**
 * Simulate a login
 */
function apiLogin(a: string, p: string) {
  if (a === 'ed' && p === 'ed') return Promise.resolve({ isAdmin: true })
  if (p === 'ed') return Promise.resolve({ isAdmin: false })
  return Promise.reject(new Error('invalid credentials'))
}

export const useUserStore = defineStore({
  id: 'user',
  state: () => ({
    name: 'Eduardo',
    isAdmin: true,
  }),
  
  getters:{
	userName: (state) => `Get userName from getter ${state.name}`
  },
  
  actions: {
  /**
  * 退出logout
  */
    logout() {
      this.$patch({
        name: '',
        isAdmin: false,
      })
  /**
   * 登录 login
   */
    async login(user: string, password: string) {
      const userData = await apiLogin(user, password)
      this.$patch({
        name: user,
        ...userData,
      })
    },
  },
})

相比较于vuex,pinia去除了mutation,同步和异步操作都通过actions,并且没有了module的概念,defineStore会创建一个新的store。

组件中使用store

<script setup lang="ts">
import { useUserStore } from "./store/user"

const userStore = useUserStore()

//访问state
console.log(userStore.name)
//访问getter
console.log(userStore.userName)
</script>

然后就可以通过user来访问store中的state,并且还可以调用getter和action。

getter
Getter 完全等同于 Store 状态的计算值。 它们可以用 defineStore() 中的 getters 属性定义。 他们接收“状态”作为第一个参数以鼓励箭头函数的使用,可以直接在 store 实例上访问 getter。
我们也可以在定义常规函数时通过 this 访问到整个 store 的实例。
 

action
Actions 相当于组件中的 methods。 它们可以使用 defineStore() 中的 actions 属性定义,并且它们非常适合定义业务逻辑,也可以直接在store实例上调用action。
在actions中也可以在定义常规函数时通过 this 访问到整个 store 的实例。
 

export const useStore = defineStore('main', {
  state: () => ({
    counter: 0,
  }),
  actions: {
    increment() {
      this.counter++
    },
    randomizeCounter() {
      this.counter = Math.round(100 * Math.random())
    },
  },
})

2.5 修改state

1、直接修改

虽然可以通过pinia实例直接修改,但是出于代码结构来说,全局的状态管理还是不要直接在各个组件处随意修改状态,应放于 action 中统一方法修改(piain没有mutation)并不推荐!

store.count ++;
2、使用$patch

使用$patch改变数据 $patch 可以同时修改多个值。

store.$patch((state) => {
        state.name= 'newName'
        state.age ++
      })
3、使用actions

推荐

actions:{
    async login(user: string, password: string) {
      //模拟异步登录
      const userData = await apiLogin(user, password)
      //更新state中数据
      this.$patch({
        name: user,
        ...userData,
      })
    }
}

2.6 storeToRefs

为了直接获取store中的属性,我们可能会利用解构来直接获取:

import { useUserStore } from "./store/user"

const { name }= useUserStore()

 但是,值得注意的是,如果直接解构store实例来获取state中的值,那么获取的值就失去了响应式,正确的做法是使用storeToRefs:

import { storeToRefs } from 'pinia'
import { useUserStore } from "./store/user"

const { name }= storeToRefs(useUserStore())

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

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

相关文章

Leetcode1334. 阈值距离内邻居最少的城市

Every day a Leetcode 题目来源&#xff1a;1334. 阈值距离内邻居最少的城市 解法1&#xff1a;Floyd 算法 使用 Floyd 算法得到任意两点之间的最短路&#xff0c;然后统计每一个节点满足条件&#xff08;距离在 distanceThreshold 以内&#xff09;的邻居数量。 代码&…

Mysql词法分析实验(二)

表名叫select123能不能创建一个表&#xff1f; 在 MySQL 中&#xff0c;可以创建一个名为 select123 的表&#xff0c;但由于 SELECT 是 MySQL 的一个保留关键字&#xff0c;通常建议避免使用它作为表名的一部分&#xff0c;以防止潜在的解析错误或混淆。如果确实需要使用这样…

带头双向循环链表的实现

带头双向循环链表的实现 文章目录 带头双向循环链表的实现一、模型构建二、代码实现&#xff08;接口函数以及测试用例&#xff09;①初始化 Create函数②尾插③尾删④头插⑤头删⑥查找⑦在pos位置前插入新尾插新头插 ⑧删除pos位新尾删新头删 ⑨销毁链表⑩打印链表⑪测试用例…

SAP Debug时如何跳过(不执行)某些代码

Debug时如何跳过(不执行)某些代码 在DEBUG界面, 首先将光标定位到想跳至的代码行, 然后从右键菜单中选择Goto Statement, 或者从Debugger菜单中选择Goto Statement:&#xff08;效果相同&#xff09; 然后光标就会定位到想跳至的代码行 执行结果如下: 结果是000的原因是&#…

保姆级前端翻牌效果(CSS)

效果 翻牌效果 hover 时候 代码直接上 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

微服务的注册发现和微服务架构下的负载均衡

文章目录 微服务注册模型服务注册与发现怎么保证高可用【1. 服务端崩溃检测】【2. 客户端容错】【3. 注册中心选型】 微服务架构下的负载均衡【1.轮询与加权轮询】【2.随机与加权随机】【3.哈希与一致性哈希】【4.最少连接数】【5.最少活跃数】【6.最快响应时间】【总结】 负载…

消防救援大队应用“码“上监管 实现重点领域监督全覆盖

近年以来&#xff0c;一直存在消防安全风险防控不精准、问题发现不及时、监督效果不明显等难点问题&#xff0c;我们充分利用信息化手段&#xff0c;探索开通“码上监督”网络举报平台&#xff0c;实现监督途径从“线下”拓展到“线上”&#xff0c;“码上监督”马上办。 问题…

容器size()无符号数导致的for循环崩溃

1.问题描述 容器size()无符号数导致的for循环崩溃 for (int index 0; index < static_cast(intVec.size())-1; index) { printf(“%d”,intVec[index]); } 如果不做强转&#xff0c;可能会有两个问题&#xff1a; &#xff08;1&#xff09;编译不过 &#xff08;2&#x…

K8S 集群搭建

1、搭建清单 2台linux服务器&#xff08;一个master节点&#xff0c;一个node节点&#xff09;&#xff0c;建议搭3台&#xff08;一个master&#xff0c;两个node&#xff09; 我使用的是腾讯云&#xff0c;节点与节点使用公网IP通信 确保2台服务器都安装了docker 2、服务…

unity 使用Vuforia扫描实体物体交互

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.从 Unity 的菜单 Assets -> Import package -> Custom Package 导入脚本&#xff0c;添加 Vuforia Engine…

Echarts 图表添加横向 竖向滚动条

1.横向滚动条 dataZoom: [{// 设置滚动条的隐藏与显示show: true,// 设置滚动条类型type: "slider",// 设置背景颜色backgroundColor: "rgb(19, 63, 100)",// 设置选中范围的填充颜色fillerColor: "rgb(16, 171, 198)",// 设置边框颜色borderCo…

PGVector 管理工具 pgAdmin

PGVector 管理工具 pgAdmin pgAdmin 下载地址pgAdmin 安装pgAdmin 使用 pgAdmin 下载地址 https://www.postgresql.org/ftp/pgadmin/pgadmin4/ pgAdmin 安装 双击 pgadmin4-*-x64.exe 安装文件&#xff0c;选择安装路径&#xff0c;后面安装提示单击 next 就可以了。 pgAdm…

数据迁移教程 | 从 Postgre/Greenplum 到 DolphinDB

PostgreSQL 是一种开源的关系型数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;是最广泛使用的开源数据库之一。它允许用户通过添加自定义函数、数据类型和索引等方式扩展其功能&#xff0c;支持 ACID 事务&#xff0c;并使用多版本并发控制 (MVCC&#xff09;来管理并…

JDK 环境变量设置

目录 一. 前言 二. 下载 JDK 2.1. JDK 8 2.2. JDK 17 2.3. JDK 21 三. 环境变量设置 3.1. Windows 环境配置 3.1.1. 打开环境变量配置窗口 3.1.2. 配置环境变量 JAVA_HOME 3.1.3. 配置环境变量 CLASSPATH 3.1.4. 环境变量 Path 末尾追加 3.1.5. 检查JDK是否安装成…

北斗卫星推动我国法治建设

北斗卫星推动我国法治建设发展 10月26日下午&#xff0c;第二届北斗规模应用国际峰会北斗规模应用法治保障专题论坛在湖南省株洲市召开。与会专家围绕北斗法治建设全局、北斗涉外法治建设、北斗品牌塑造、北斗产业生态建设及政策法规完善等方面&#xff0c;进行了深入研讨交流。…

搬砖日记:post传数组(三种格式)

1. json型 request({url: /msg/message/batch/read,data,method: post,content-Type: application/json })2. formData数组型 Content-Type: application/x-www-form-urlencoded request({url: /msg/message/batch/read,data,method: post,})3.formData字段重复传型 把data换成…

经典文献阅读之--Fast and Robust Ground Surface Estimation...(均匀B样条采样快速估计地平面)

0. 简介 对于激光雷达的地面估计分割&#xff0c;目前其实有很多方法做了快速并鲁棒的分割&#xff0c;比如说我们之前写的一篇《经典文献阅读之–FEC》一文中就给出了快速分割的方案&#xff0c;当中第一步就是需要对地面进行分割。而我们这次看的是一篇使用均匀B样条的方法来…

第2关:多表查询

任务描述 join操作符编程要求测试说明 任务描述 本关任务&#xff1a; 使用join操作符实现多表查询。 join操作符 1.笛卡尔积&#xff0c;RXS 可直接转换为SQL语句 2.等值连接&#xff0c;记作 可直接转换为SQL语句 3.自然连接&#xff0c;记作 可转换为SQL语句 4.左外连接…

Java架构核心基础知识硬核整理,赶快收藏起来吧!!!

Java架构核心基础 lecture&#xff1a;波哥 一、数据结构和算法 1.数据结构 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同…

保护您的Google账号安全:检查和加固措施

简介&#xff1a;随着我们在日常生活中越来越依赖于Google账号&#xff0c;我们的个人信息和敏感数据也变得越来越容易受到威胁。为了确保您的Google账号的安全性&#xff0c;本文将介绍一些简单但有效的方法&#xff0c;帮助您检查和加固您的Google账号。 --- 在数字时代&am…