Vue3之组件间传值避坑指南

news2024/12/26 11:12:29

组件间传值的两个坑

我们都知道父组件可以把值传递到自组件中,但是有时候子组件需要修改这个父组件传递过来的这个值,我们可以想象下能修改成功吗?这是坑之一。我们在组件间传值的时候,都是一个属性名对应一个值,接收的时候也是用这个属性名接收,那么每一个用户自定义的属性名都能被接收到吗?这是坑之二,本文就让我们一起来看下这两个坑吧。

实例填坑

坑一

1. 发现天坑

我们通过一个计数器组件来演示这个坑,当想对父组件传递过来的值做操作时,发现操作无效,先看代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://unpkg.com/vue@next"></script>
    <title>组件间传值</title>
</head>
<body>
    <div id="root"></div>
</body>
<script>
    const app = Vue.createApp({
        data() {
            return {
                num:0
            }
        },
       template: `
                <div>
                   <counter :count = "num"/>
                </div>
                ` 
    });

    // 定义一个test组件
    app.component('counter',{
       props: ['count'],
      template: `<div @click="count+=1">{{count}}</div>`
    });

    const vm = app.mount('#root');
</script>
</html>

在上面的代码中,我们定义了一个counter组件接收父组件的一个count值,当点击这个显示的值时,我们做加一操作。这时候我们运行代码会发现,我们的值并不会完成加一操作,而是会报父组件传递过来的值是只读的:

在这里插入图片描述

2. 填坑时刻

那假如我们要完成这个加一的功能怎么办呢?答案就是我们复制一份父组件传递过来的值,对我们自己的值进行操作:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://unpkg.com/vue@next"></script>
    <title>组件间传值</title>
</head>
<body>
    <div id="root"></div>
</body>
<script>
    const app = Vue.createApp({
        data() {
            return {
                num:0
            }
        },
       template: `
                <div>
                   <counter :count = "num"/>
                </div>
                ` 
    });

    // 定义一个test组件
    app.component('counter',{
       props: ['count'],
       data(){
        return{
            mCount:this.count
        }
       },
      template: `<div @click="mCount+=1">{{mCount}}</div>`
    });

    const vm = app.mount('#root');
</script>
</html>

这时候我们再运行代码就会发现我们可以做加一操作了:
在这里插入图片描述

坑2:

1.发现天坑

当我们定义一个单词名称比较长的属性,并且用“-”分隔符连接的时候,子组件无法接收到正确的值,显示NaN。代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://unpkg.com/vue@next"></script>
    <title>组件间传值</title>
</head>
<body>
    <div id="root"></div>
</body>
<script>
    const app = Vue.createApp({
        data() {
            return {
                content:"hello world"
            }
        },
       template: `
                <div>
                   <test :content-helloworld = "content"/>
                </div>
                ` 
    });

    // 定义一个test组件
    app.component('test',{
       props: ['content-helloworld'],
      template: `<div>{{content-helloworld}}</div>`
    });

    const vm = app.mount('#root');
</script>
</html>

在上面的代码中,我们使用content-helloworld这个属性在父组件和子组件之间传值,按照我们的理解,应该是能传递成功的,但是显示的结果却不正确

在这里插入图片描述上面到坑也是VUE中的单向数据流的概念,即子组件可以使用父组件传递过来的数据,但是不能修改父组件传递过来的数据

2.填坑时刻

当我们定义的属性值中有用“-”分隔符分隔时,我们在接收值的时候,需要将属性名改成驼峰命名的方式,如上面的例子中父组件使用content-helloworld传递值到子组件,那么子组件接收到时候应该将其改成驼峰命名方式:使用contentHelloworld接收

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://unpkg.com/vue@next"></script>
    <title>组件间传值</title>
</head>
<body>
    <div id="root"></div>
</body>
<script>
    const app = Vue.createApp({
        data() {
            return {
                content:"hello world"
            }
        },
       template: `
                <div>
                   <test :content-helloworld = "content"/>
                </div>
                ` 
    });

    // 定义一个test组件
    app.component('test',{
       props: ['contentHelloworld'],
      template: `<div>{{contentHelloworld}}</div>`
    });

    const vm = app.mount('#root');
</script>
</html>

这样值就能正确显示了
在这里插入图片描述

总结

本文主要是讲解了组件传值过程中的两个容易犯的小错误,一是父组件传递过来的值不能修改,二是父组件使用“-”分隔符定义属性传递值到子组件,子组件接收时需要将属性名改为驼峰命名方式

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

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

相关文章

泛函分析导论

它的基本思想是将函数看作向量&#xff0c;从而将函数空间转化为向量空间&#xff0c;进而研究函数空间的性质。泛函分析的主要内容包括&#xff1a;线性空间、内积空间、赋范空间、希尔伯特空间、算子理论、谱理论、函数空间等。空间与算子度量空间赋范空间和巴拿赫空间线性算…

Mybatis插件开发及执行原理

mybatis源码下载 https://github.com/mybatis/mybatis-3&#xff0c;本文分析源码版本3.4.5 mybatis启动大致流程 在看这篇文章前&#xff0c;建议查看我另一篇文章&#xff0c;以了解框架启动的流程和框架中一些重要对象&#xff1a;https://blog.csdn.net/Aqu415/article/…

com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannel

一 完成的错误信息 异常Message one Caused by: com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information 异常Message two [com.alibaba.nacos.client.remote.worker] ERROR…

K8S 实用工具之二 - 终端 UI K9S

开篇 &#x1f4dc; 引言&#xff1a; 磨刀不误砍柴工工欲善其事必先利其器 第一篇&#xff1a;《K8S 实用工具之一 - 如何合并多个 kubeconfig&#xff1f;》 像我这种&#xff0c;kubectl 用的不是非常溜&#xff0c;经常会碰到以下情况&#xff1a; 忘记命令&#xff0c;先…

基于粒子群改进的支持向量机SVM的情感分类识别,pso-svm情感分类识别

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的情感分类预测 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型…

【C++修炼之路】25.哈希应用--布隆过滤器

每一个不曾起舞的日子都是对生命的辜负 布隆过滤器前言一.布隆过滤器提出二.布隆过滤器概念三. 布隆过滤器的操作3.1 布隆过滤器的插入3.2 布隆过滤器的查找3.3 布隆过滤器的删除四.布隆过滤器的代码4.1 HashFunc的仿函数参考4.2 BloomFilter.h五.布隆过滤器的优缺点六.布隆过滤…

Spring——Bean管理-xml方式进行属性注入

目录 一、xml方式创建对象 二、xml方式注入属性 第①种方式注入&#xff1a;set方法注入 第②种方式注入&#xff1a;有参构造函数注入 constructor-arg&#xff1a;通过构造函数注入 用name标签属性&#xff1a; 不按照顺序也会自动匹配 使用index标签属性&#xff1a;…

使用Struts的论坛系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网的高速发展&#xff0c;目前可通过论坛系统可随时取得国际最新的软件及信息&#xff0c;也可以通过论坛系统来和别人讨论计算机软件、硬件、多媒体、程序设计、以及影视等等各种有趣的话题。本系统按照小型公司的实际要求…

第三讲:ambari编译后的安装包制作流程说明

一、概述 前两讲,我们已经将 Ambari 源码编译成功。现在我们想将 Ambari 编译后的 rpm 包,都放到 yum 本地仓库中,这样 Ambari 与 HDP 在安装部署时,就直接使用的我们自己编译的安装包了。 Ambari 的 rpm 包,有这么几类: ambari-server rpmambari-agent rpmambari metr…

React.memo 解决函数组件重复渲染

为什么会存在重复渲染? react 在 v16.8 版本引入了全新的 api&#xff0c;叫做 React Hooks&#xff0c;它的使用与以往基于 class component 的组件用法非常的不一样&#xff0c;不再是基于类&#xff0c;而是基于函数进行页面的渲染&#xff0c;我们把它又称为 functional c…

id函数 / 可变类型变量 / 不可变类型变量 / +=操作

前言 再说正文之前&#xff0c;需要大家先了解一下对象&#xff0c;指针和引用的含义&#xff0c;不懂得同学可以参考我上一篇博客“(12条消息) 引用是否有地址的讨论的_xx_xjm的博客-CSDN博客” 正文 一&#xff1a;python中一切皆对象 “python中一切皆对象”这句话我相信…

【LeetCode】剑指 Offer(15)

目录 题目&#xff1a;剑指 Offer 32 - II. 从上到下打印二叉树 II - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 32 - III. 从上到下打…

分子模拟—Ovito渲染案例教程

♡\heartsuit♡♠\spadesuit♠《分子模拟—Ovito渲染案例教程》♡\heartsuit♡♠\spadesuit♠&#xff1a; 说明&#xff1a; 本博文主要介绍专栏 《分子模拟—Ovito渲染案例教程》\rm 《分子模拟—Ovito渲染案例教程》《分子模拟—Ovito渲染案例教程》, 依托于实际的物理问题…

高数:数列的收敛

数列特点无限个数特定顺序数列和集合区别集合可以乱序&#xff0c;数列不行集合出现重复元素依然相同&#xff0c;数列出现新的重复元素就不相等[1&#xff0c;2&#xff0c;3&#xff0c;4][1&#xff0c;2&#xff0c;3&#xff0c;3&#xff0c;4]对集合来说相等&#xff0c…

【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上)

系列文章目录 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上) 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(中) 文章目录系列文章目录前言一、数据库配置信息二、下载OGG1…

LQB手打代码,DS1302基础代码01

一&#xff0e;描述 DS1302时钟芯片是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能。DS1302芯片包含一个用于存储实时时钟/日历的 31 字节的静态 RAM&#xff0c;可通过…

docker 运行花生壳实现内外网穿透

环境&#xff1a;centos 7 ,64位 1、创建一个指定的文件夹作为安装示例所用&#xff0c;该示例文件夹为“hsk-nwct”。“hsk-nwct”内创建“app”文件夹作为docker容器挂载出来的文件。 2、在“app”内下载花生壳linux安装包&#xff0c;下载花生壳应用&#xff1a;花生壳客户…

最新版本vue3+vite重构尚品汇(解决接口问题)第21-50集

第21集&#xff0c;第22集&#xff1a;照敲就行&#xff0c;引入概念。 第23集&#xff1a;防抖概念&#xff1a;前面所有的触发被取消&#xff0c;最后一次执行在规定的时间之后才会触发&#xff0c;只会执行一次。Lodash插件里面封装了函数的防抖和节流的业务。用到lodash确实…

SpringAOP——基础知识

AOP AOP全称是Aspect Oriented Programming 即面向切面编程&#xff0c;是对一类统一事务的集中处理 例如&#xff0c;我们的网页许多地方都需要进行登陆验证&#xff0c;这时就需要在很多地方添加重复的验证代码&#xff0c;而AOP可以集中配置需要登陆验证的地方&#xff0c;…