Vue.js中props的使用

news/2024/4/30 19:03:42/文章来源:https://blog.csdn.net/conving/article/details/127284655

作用: props是用于Vue中 父组件 向 子组件 传值的时候使用。

  • props的传递是单向的。
  • 不要在子组件改变props的值。

一、props的定义

props 需要使用 props 选项来定义:

export default {props: ['foo'],created() {// props 会暴露到 `this` 上console.log(this.foo)}
}

除了使用字符串数组来声明 prop 外,还可以使用对象的形式:

export default {props: {title: String,likes: Number}
}

对于以对象形式声明中的每个属性,key 是 prop 的名称,而值则是该 prop 预期类型的构造函数。比如,如果要求一个 prop 的值是 number 类型,则可使用 Number 构造函数作为其声明的值。

对象形式的 props 声明不仅可以一定程度上作为组件的文档,而且如果其他开发者在使用你的组件时传递了错误的类型,也会在浏览器控制台中抛出警告。

二、父子组件

看一下官方文档:

组件实例的作用域是孤立的。这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据。父组件的数据需要通过 prop 才能下发到子组件中。

也就是props是子组件访问父组件数据的唯一接口。

详细一点解释就是:

  • 一个组件可以直接在模板里面渲染data里面的数据(双大括号)。
  • 子组件不能直接在模板里面渲染父元素的数据。
  • 如果子组件想要引用父元素的数据,那么就在prop里面声明一个变量(比如a),这个变量就可以引用父元素的数据。然后在模板里渲染这个变量(前面的a),这时候渲染出来的就是父元素里面的数据。

在 Vue 中,注册 props 的方式有两种:

  • 第一种方式是,以字符串数组的方式列出 props,数组中的每个实体对应一个 prop 名称。
  • 第二种方法是将 props 定义为一个对象,每个 key 对应于 prop 名称。

    <div id="app1"><!-- hello引用父元素的hello,它也可以引用message,greet,world等 --><child :hello='hello'></child></div><script>var com1 = Vue.component('child',{// 声明在prop中的变量可以引用父元素的数据props:['hello'],// 这里渲染props中声明的那个hellotemplate:'<div><p>{{ hello }}</p></div>',})var app1 = new Vue ({el: '#app1',data: {greet: {hello:'hello,',world: 'world',},message: 'message1',}})</script>

组件接受的选项之一 props 是 Vue 中非常重要的一个选项。父子组件的关系可以总结为:

props down, events up

父组件通过 props 向下传递数据给子组件;子组件通过 events 给父组件发送消息。

总之,我们使用 props 将数据从父组件传递给子组件。子组件还会向父组件发出事件,以防您需要从子组件向父组件发送数据/事件。

三、Prop 名字格式

如果一个 prop 的名字很长,应使用 camelCase 形式,因为它们是合法的 JavaScript 标识符,可以直接在模板的表达式中使用,也可以避免在作为属性 key 名时必须加上引号。

export default {props: {greetingMessage: String}
}
<span>{{ greetingMessage }}</span>

虽然理论上你也可以在向子组件传递 props 时使用 camelCase 形式 (使用 DOM 模板时例外),但实际上为了和 HTML attribute 对齐,我们通常会将其写为 kebab-case 形式:

<MyComponent greeting-message="hello" />

对于组件名我们推荐使用 PascalCase,因为这提高了模板的可读性,能帮助我们区分 Vue 组件和原生 HTML 元素。然而对于传递 props 来说,使用 camelCase 并没有太多优势,因此我们推荐更贴近 HTML 的书写风格。

四、props 是一种单向数据绑定

当父组件的属性变化时,将传导给子组件,但是反过来不会。

每次父组件更新时,子组件的所有 prop 都会更新为最新值。

不要在子组件内部改变 prop。如果你这么做了,Vue 会在控制台给出警告。

在两种情况下,我们很容易忍不住想去修改 prop 中数据:

  1. Prop 作为初始值传入后,子组件想把它当作局部数据来用;
  2. Prop 作为原始数据传入,由子组件处理成其它数据输出。

props 是一种单向数据绑定,组件永远不该改变自己的 props 的值,这点很重要。坚守这点的原因有很多。其一是,组件修改 props 会造成程序调试困难。如果一个值被传递进多个子组件,将很难定位这个值是在哪里被修改的。此外,修改 props 会造成组件重新渲染。所以,一个组件里突变的 props 会触发组件重新渲染,这可能会反过来再次触发 props 突变。

五、例子参考

例子1

使用 props 的主要目标是传递数据/信息。您可以使用 v-bind 将您的值作为数据属性传递。

流程:从子组件props: ['data1', 'data2'] ,在父组件中 查找data1,data2的对应的name、age值

Parent.vue(父组件)

<template><div class="outer"><h3>父组件</h3>名字:<input v-model="name"><br>年龄:<input v-model="age"><br><child v-bind:data1="name" v-bind:data2="age"></child></div>
</template><script>import Child from "./Child";
export default {name: 'Parent',components: {Child},data() {return {name: "Tony",age: 20}}
}
</script><style scoped>
.outer {margin: 20px;border: 2px solid red;padding: 20px;
}
</style>

Child.vue(子组件)

<template><div class="outer"><h3>子组件</h3><div>父组件传过来的data1:{{data1}}</div><div>父组件传过来的data2:{{data2}}</div></div>
</template><script>export default {props: ['data1', 'data2']
}
</script><style scoped>
.outer {margin: 20px;border: 2px solid blue;padding: 20px;
}
</style>

路由(store/index.js)

import Vue from 'vue'
import Router from 'vue-router'
import Parent from "../components/Parent";Vue.use(Router)export default new Router({routes: [{path: '/parent',name: 'Parent',component: Parent,}],
})

结果:

 修改父组件的值,可以看到,父组件修改了值之后,子组件立刻同步更新。

 

例子2

父子组件可以利用pros直接传值,在子组件中定义props,并可规定传值类型,当父组件使用子组件时传入相应参数,即可把父组件的数值传递到子组件中。

父组件App.vue

<template><div id="app"> {{msg}}<hellochange :msgchange=msgdata></hellochange></div>
</template><script>
import HelloChange from './components/HelloChange.vue'export default {  components:{hellochange:HelloChange},   data () { return {       msg:'你好vue',msgdata:'我是父组件传值'}}     }
</script>

子组件HelloChange.vue

<template><!-- 所有的内容要被根节点包含起来 --><div id="hellochange">    {{msg}}<br>{{msgchange}}     </div>
</template><script>export default{data(){return {               msg:'我是一个home组件'             }},props:{msgchange:{type:String}}}
</script>

效果:

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

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

相关文章

drf jwt 原理,cookie,session,token base64

drf jwt 原理&#xff0c;cookie&#xff0c;session&#xff0c;token base64 文章目录drf jwt 原理&#xff0c;cookie&#xff0c;session&#xff0c;token base641、cookie&#xff0c;session&#xff0c;token介绍2、jwt 原理介绍3、 base64编码和解码4、drf-jwt快速使用…

深度学习 Day 15——利用卷神经网络实现好莱坞明星识别

深度学习 Day 15——利用卷神经网络实现好莱坞明星识别 文章目录深度学习 Day 15——利用卷神经网络实现好莱坞明星识别一、前言二、我的环境三、前期工作1、导入依赖项并设置GPU2、导入数据集3、查看数据集四、数据预处理1、加载数据2、检查数据并可视化数据3、配置数据集五、…

【Spring依赖循环】提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?

前言 问&#xff1a;什么是循环依赖&#xff1f; 循环依赖&#xff1a;说白是一个或多个对象实例之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成了构成一个环形调用。 问&#xff1a;Spring 如何解决循环依赖&#xff1f; 答&#xff1a;Spring 通过提前曝光机…

vue读取本机的excel文件的两种方式

安装依赖 npm install xlsx --save引入 import XLSX from ‘xlsx’ 更新&#xff1a;2022-04-26 最新的xlsx依赖包引入方式改变&#xff0c;以前的直接引入失败了&#xff0c;切换成以下依赖方式&#xff1a; import { read, utils } from xlsx如果有使用elementUI&#xf…

JavaScript基础万字总结---重点

目录JavaScript简介什么是JavaScript浏览器执行JS过程JS的组成JS的引入方式函数与作用域arguments的使用全局变量与局部变量预解析对象创建对象的三种方式1.利用字面量创建对象2.利用 new Object 创建对象3.利用构造函数创建对象遍历对象属性变量、属性、函数、方法总结new关键…

0053 Exception异常

/*异常Java语言中&#xff0c;将程序执行中发生的不正常情况称为"异常"。&#xff08;语法错误和逻辑错误不是异常&#xff09;执行过程中所发生的异常可分为两类1.Error&#xff1a;Java虚拟机无法解决的严重问题&#xff0c;程序会崩溃如&#xff1a;JVM系统内部错…

如何免费使用GPU进行加速?(两种方法)

文章目录如何使用免费的GPU?Kaggle使用免费GPUGoogle Colab 使用免费GPU小结如何使用免费的GPU? 我是学生党&#xff0c;最近在学习深度学习&#xff0c;需要用到GPU加速&#xff0c;现分享两个免费使用GPU的方法。 1、使用 Kaggle 的免费GPU&#xff0c;Kaggle每周可以赠送…

Android 最全Ignore文件 : 解决部分不必要文件上传到Git的问题

1. 背景 我们新建一个Android项目&#xff0c;默认会生成一个.ignore文件 *.iml .gradle /local.properties /.idea/caches /.idea/libraries /.idea/modules.xml /.idea/workspace.xml /.idea/navEditor.xml /.idea/assetWizardSettings.xml .DS_Store /build /captures .ex…

简单了解一下C语言main函数的参数

目录 一、main函数的参数 argc 和 argv 运行效果 需要注意的两个个点 一、main函数的参数 main函数有三个参数&#xff0c;argc、argv和envp&#xff0c;envp参数的应用场景不多&#xff0c;这里就不多介绍&#xff0c;感兴趣的可以自己去了解一下 它的标准写法如下&#x…

<初识Python及编程环境搭建>——《Python》

目录 1. Python 的背景知识&#xff1a; 2. Python 的用途&#xff1a; 3. Python 的优缺点 &#xff1a; 4. 搭建 Python 编程环境&#xff1a; 4.1 安装 Python (1) 找到官方网站 (2) 找到下载页面 (3) 双击安装包 (4) 运行 hello world 4.2 安装 PyCharm 后记&a…

tensorflow多层感知机+mnist数据集

这里写目录标题keras与tensorflow建立模型的不同加载mnisttensorflow多层感知机构建全连接层函数定义感知机各层的输入和输出损失函数、优化器模型准确率计算模型训练参数定义训练开始模型训练效果可视化模型评分利用模型进行预测显示混淆矩阵keras与tensorflow建立模型的不同 …

两栏布局与三栏布局(圣杯布局与双飞翼布局)

两栏布局 右侧绝对定位的写法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&qu…

浅析某城商行手机银行水平授权漏洞问题

-问题现象描述 据报道&#xff0c;某黑客通过软件抓包、PS身份证等非法手段&#xff0c;在某城商行手机银行APP内使用虚假身份信息注册银行Ⅱ、Ⅲ类账户。 其操作方法具体来说&#xff0c;是在注册账户过程中&#xff0c;先输入本人身份信息&#xff0c;待进行人脸识别步骤时…

Flask学习笔记(十二)-Flask-Migrate实现数据库迁移详解

一、定义flask-migrate是基于Alembic的一个封装,并集成到Flask中 所有的迁移操作其实都是Alembic做的,能跟踪模型的变化,并将变化映射到数据库中。二、Flask-Migrate安装pip install flask-migrate三、使用Flask-Migrate步骤  实例展示: 目录结构:  flask_SQLalchemy:. …

MindSpore体验--在Windows10中源码安装

MindSpore体验--在Windows10中源码安装&#xff08;反面教材&#xff09; 一直以来安装包都是直接pip intall&#xff0c;发现安装MindSpore的操作流程中教学了源码编译安装&#xff0c;借此学习一下使用源码安装。 环境创建 为了方便管理环境&#xff0c;此处我新创建了一个…

多测师肖sir_高级讲师_第2个月第27讲解jmeter性能测试jmeter性能实战

jmeter性能实战 一、单接口性能测试 1、先建接口cms 登录接口 2、在监听器中添加聚合报告 3、设置线程组 &#xff08;1&#xff09;线程组&#xff1a;一个线程组中有若干个请求 &#xff08;2&#xff09;线程 &#xff1a;一个虚拟用户就是一个线程 &#xff08;3&#…

webpack的一些常用打包配置

1.webpack 是什么&#xff1f; webpack 是一个模块化打包工具 2.模块是什么&#xff1f; 模块我理解就是 import xx 后面导入的文件就是一个模块 它可以是js css 图片 等等 3&#xff0c;webpack的配置文件的作用&#xff1f; 就是根据需求自定义配置webpack webpack默认只能打…

轻轻松松搞定分布式Token校验

文章目录前言token存储Token 存储实体login 业务代码枚举类修改存储效果客户端存储token验证前端提交后端校验自定义注解切面处理使用总结前言 没想到前天小水了一篇博文&#xff0c;竟然就火了&#xff1f;&#xff01;&#xff01;既然如此&#xff0c;那我再来一篇&#xf…

第7章 单行函数

1.函数的理解 *函数可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样既提高了代码效率&#xff0c;又提高了可维护性。在SQL中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数&#xff0c;可以极大地提高用户对数据库的管理效率。 …

微信小程序|基于小程序实现打卡功能

文章目录一、文章前言二、开发流程及准备三、开发步骤一、文章前言 此文主要在小程序内实现打卡功能&#xff0c;可根据用户位置与公司设定的打卡范围实时判断打卡场景。 二、开发流程及准备 2.1、注册微信公众平台账号。 2.2、准备腾讯地图用户Key。 三、开发步骤 3.1、访问…