Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)

本文主要是介绍Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#使用props传递数据

html:传递普通的字符串

<h3>#使用props传递数据</h3>
<div id="dr01"><div>组件实例的作用域是孤立的。这意味着不能并且不应该在子组件的模板内直接引用父组件的数据。可以使用 props 把数据传给子组件。</div><br /><child msg="hello, vue.js!"></child>
</div>

js:

复制代码
//********************************************************************
//使用props传递数据
//注册组件"child"
Vue.component("child", {//声明props属性props: ['msg'],//props可以用在模板内//可以用"this.msg"设置template: '<div>msg: {{msg}}</div>'
});
var dr01 = new Vue({el: "#dr01",
});
复制代码

 结果展示:

  

#camelCase vs. kebab-case

html:在html中定义或者绑定属性的时候要符合kebab-case规则

复制代码
<h3>#camelCase vs. kebab-case</h3>
<div id="dr02"><div>HTML 特性不区分大小写。名字形式为 camelCase 的 prop 用作特性时,需要转为 kebab-case(短横线隔开)</div><br /> <!-- kebab-case in html --><child02 my-message02="Hello, this is kebab-case message!"></child02>
</div>
复制代码

js:在js中定义的属性名称如果是"camelCase"规则,则在html定义或者绑定value的时候要用"kebab-case"规则(像烤羊肉串一样的烤串命名法)

复制代码
//********************************************************************
//camelCase vs. kebab-case
//注册组件child02
Vue.component("child02", {//在js中用驼峰命名法props: ["myMessage02"],template: "<div>myMessage02: {{myMessage02}}</div>"
});
var dr02 = new Vue({el: "#dr02",
});
复制代码

 结果展示:

  

#动态Props

html:

复制代码
<h3>#动态Props</h3>
<div id="dr03"><div><input v-model="parentMsg" placeholder="please input parentMsg" /></div><br /><!-- 用v-bind绑定数据parentMsg到组件中 --><child03 v-bind:my-message03="parentMsg"></child03><!-- 缩写v-bind--><child03 :my-message03="parentMsg"></child03>
</div>
复制代码

 

js:

复制代码
//********************************************************************
//动态Props
//注册组件myMessage03
Vue.component("child03", {props: ['myMessage03'],template: "<div>myMessage03: {{myMessage03}}</div>"
});
var dr03 = new Vue({el: "#dr03",data: {parentMsg: "Hello, this is parentMsg!",}
});
复制代码

 结果展示:

  

#字面量语法 VS 动态语法

html:如果在为vue组件prop定义或者赋值的时候用了“v-bind:”的动态语法,则会先将其转化为js表达式,然后计算结果赋值,下面示例中,第一个传递的是字符串,第二个传递的是123+456即579的数值

复制代码
<h3>#字面量语法 VS 动态语法</h3>
<div id="dr04"><!-- 这里传递是字符串 --><child04 my-message04="123+456"></child04><!-- 这里用了动态语法,传递的值会通过js的表达式计算,传递的是数字 --><child04 :my-message04="123+456"></child04>
</div>
复制代码

 

js:

复制代码
//********************************************************************
//字面量语法 VS 动态语法
Vue.component("child04", {props: ["myMessage04"],template: "<div>myMessage04: {{myMessage04}}</div>",
});
var dr04 = new Vue({el: "#dr04",
});
复制代码

 结果展示:

  

#Prop类型绑定

prop 默认是单向绑定:当父组件的属性变化时,将传导给子组件,但是反过来不会。这是为了防止子组件无意修改了父组件的状态——这会让应用的数据流难以理解。不过,也可以使用 .sync 或 .once 绑定修饰符显式地强制双向或单次绑定:

注意:双向绑定会把子组件的 msg 属性同步回父组件的 parentMsg 属性。单次绑定在建立之后不会同步之后的变化。

html:

复制代码
<h3>#Prop类型绑定(单向、双向)</h3>
<div id="dr05"><div><div>vue实例:</div><input v-model="name" /></div><br /><div><div>component组件(默认):</div><child05 :my-message05="name"></child05><div>component组件(once):</div><child05 :my-message05.once="name"></child05><div>component组件(sync):</div><child05 :my-message05.sync="name"></child05></div>
</div>
复制代码

 js:

复制代码
//********************************************************************
//Prop类型绑定
Vue.component("child05", {props: ["myMessage05"],template: '<input type="text" v-model="myMessage05" />'
});
var dr05 = new Vue({el: "#dr05",data: {name: "DarkRanger",}
});
复制代码

 结果展示:

  

#Prop验证

html:

复制代码
<h3>#Prop验证</h3>
<div id="dr06"><div><div>name:{{dr.name}}, age:{{dr.age}}.</div><div><input v-model="telphone" /></div></div><div><child06 :msg_null="123+456" msg_string="this is string" :msg_number="99" :msg_twoway.sync="telphone" :msg_validate="mobilephone" :msg_number2String="mobilephone" :msg_obj2json="dr" :msg_json2obj="drJson"></child06></div>
</div>
复制代码

 js:

复制代码
//********************************************************************
//Prop验证
Vue.component("child06", {props: {//基础类型检测("null"意思是任何类型都可以)msg_null: null,//String类型,必须是定义过的,可以是空字符串""
        msg_string: {type: String,required: true,},//Number类型,默认值100
        msg_number: {type: Number,default: 100,},//Object类型,返回值必须是js对象
        msg_obj: {type: Object,default: function() {return {name: "DarkRanger",age: "18",}}},//指定这个prop为双向绑定//如果绑定类型不对将抛出一条警告
        msg_twoway: {type: String,twoWay: true,},//自定义验证,必须是Number类型,验证规则:大于0
        msg_validate: {type: Number,validator: function(val) {return val > 0;}},//将值转为String类型//在设置值之前转换值(1.0.12+)
        msg_number2string: {coerce: function(val) {return val + ""}},//js对象转JSON字符串
        msg_obj2json: {coerce: function(obj) {return JSON.stringify(obj);}},//JSON转js对象
        msg_json2obj: {coerce: function(val) {return JSON.parse(val);}},},template: '<div>msg_null: {{msg_null}}</div>' 
    + '<div>msg_string:{{msg_string}}</div>'
    + '<div>msg_number: {{msg_number}}</div>'
    + '<div>msg_obj:{{"name-->"+msg_obj.name+", age-->"+msg_obj.age}}</div>'
    + '<div>msg_twoway:<input v-model="msg_twoway"></div>'
    + '<div>msg_validate:{{msg_validate}}</div>'
    + '<div>msg_number2String: {{msg_number2string}}</div>'
    + '<div>msg_obj2json: {{msg_obj2json}}</div>'
    +'<div>msg_json2obj:{{"name: "+msg_json2obj.name+"; age: "+msg_json2obj.age}}</div>' }); var dr06 = new Vue({el: "#dr06",data: {telphone: "0356-1234567",mobilephone: 15912345678,dr: {name: "DarkRanger",age: 25},drJson: '{"name":"DarkRanger","age":25}',} })
复制代码

 

展示结果:

  

解释:

1、msg_null:不论什么数据类型,只要能解析成功,就渲染成正确的html

2、msg_string:只能传递String类型的字符串,如果将child06中的“msg_string="this is string"”更改为“:msg_string="1+2"”,

  控制台报错:

3、msg_number:如果在child06标签中没有定义值,我们将会取默认值100,现在定义了“:msg_number="99"”,如果将“:msg_number="99"”更改为“msg_number="99"”,控制台报错:

  

4、msg_obj:在js中我们定义的msg_obj的default属性是一个具有返回js对象的函数,这里取值的时候直接取的就是返回值,如果在child06中定义或者绑定了新的js对象,则会将msg_obj更新为新的数据。取js对象属性值的时候用{{Object.prop}}取值即可。

5、msg_twoway:双向数据绑定,在测试的过程中发现,即使设置“twoWay: true”,当子组件发生变化时,vue实例的数据并不会更新,还是单向的数据绑定,这里我将child06中原先的“:msg_twoway="telphone"”更改为“:msg_twoway.sync="telphone"”,保证测试能够数据双向绑定。

6、msg_validate:有验证规则的组件数据,这里定义的规则是当前数值必须大于0,如果将child06中的“:msg_validate="mobilephone"”更改为“:msg_validate="-1"”。控制台报错:

  

7、msg_number2string:在结果赋值之前将数值转化为字符串。

8、msg_obj2json:vue.js内置了JSON的两个方法,一个是JSON.parse(jsonStr)--》将JSON字符串转化为js对象,另外一个是JSON.stringify(obj)--》将js对象序列化为JSON字符串。

这里是将obj转化为json字符串,需要添加coerce属性,它是一个具有返回json字符串的函数,当然不是必须得用JSON.stringify(obj)方法,只要方法合理,能够转化为json能够识别的字符串即可。

9、msg_json2obj: 将json字符串转化为js对象。

 

最后附上完整的html代码:

复制代码
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><script type="text/javascript" src="js/vue.js"></script><title>组件传递数据Props</title></head><body style="background-color: lightgray;"><h3>#使用props传递数据</h3><div id="dr01"><div>组件实例的作用域是孤立的。这意味着不能并且不应该在子组件的模板内直接引用父组件的数据。可以使用 props 把数据传给子组件。</div><br /><child msg="hello, vue.js!"></child></div><hr /><h3>#camelCase vs. kebab-case</h3><div id="dr02"><div>HTML 特性不区分大小写。名字形式为 camelCase 的 prop 用作特性时,需要转为 kebab-case(短横线隔开)</div><br /><!-- kebab-case in html --><child02 my-message02="Hello, this is kebab-case message!"></child02></div><hr /><h3>#动态Props</h3><div id="dr03"><div><input v-model="parentMsg" placeholder="please input parentMsg" /></div><br /><!-- 用v-bind绑定数据parentMsg到组件中 --><child03 v-bind:my-message03="parentMsg"></child03><!-- 缩写v-bind--><child03 :my-message03="parentMsg"></child03></div><hr /><h3>#字面量语法 VS 动态语法</h3><div id="dr04"><!-- 这里传递是字符串 --><child04 my-message04="123+456"></child04><!-- 这里用了动态语法,传递的值会通过js的表达式计算,传递的是数字 --><child04 :my-message04="123+456"></child04></div><hr /><h3>#Prop类型绑定(单向、双向)</h3><div id="dr05"><div><div>vue实例:</div><input v-model="name" /></div><br /><div><div>component组件(默认):</div><child05 :my-message05="name"></child05><div>component组件(once):</div><child05 :my-message05.once="name"></child05><div>component组件(sync):</div><child05 :my-message05.sync="name"></child05></div></div><h3>#Prop验证</h3><div id="dr06"><div><span>vue实例</span><div>name:{{dr.name}}, age:{{dr.age}}.</div><div><input v-model="telphone" /></div></div><br /><div><span>vue自定义组件</span><child06 :msg_null="123+456" msg_string="this is string" :msg_number="99" :msg_twoway.sync="telphone" :msg_validate="mobilephone" :msg_number2String="mobilephone" :msg_obj2json="dr" :msg_json2obj="drJson"></child06></div></div><script>//********************************************************************//使用props传递数据//注册组件"child"
            Vue.component("child", {//声明props属性
                props: ['msg'],//props可以用在模板内//可以用"this.msg"设置
                template: '<div>msg: {{msg}}</div>'});var dr01 = new Vue({el: "#dr01",});//********************************************************************//camelCase vs. kebab-case//注册组件child02
            Vue.component("child02", {//在js中用驼峰命名法
                props: ["myMessage02"],template: "<div>myMessage02: {{myMessage02}}</div>"});var dr02 = new Vue({el: "#dr02",});//********************************************************************//动态Props//注册组件myMessage03
            Vue.component("child03", {props: ['myMessage03'],template: "<div>myMessage03: {{myMessage03}}</div>"});var dr03 = new Vue({el: "#dr03",data: {parentMsg: "Hello, this is parentMsg!",}});//********************************************************************//字面量语法 VS 动态语法
            Vue.component("child04", {props: ["myMessage04"],template: "<div>myMessage04: {{myMessage04}}</div>",});var dr04 = new Vue({el: "#dr04",});//********************************************************************//Prop类型绑定
            Vue.component("child05", {props: ["myMessage05"],template: '<input type="text" v-model="myMessage05" />'});var dr05 = new Vue({el: "#dr05",data: {name: "DarkRanger",}});//********************************************************************//Prop验证
            Vue.component("child06", {props: {//基础类型检测("null"意思是任何类型都可以)
                    msg_null: null,//String类型,必须是定义过的,可以是空字符串""
                    msg_string: {type: String,required: true,},//Number类型,默认值100
                    msg_number: {type: Number,default: 100,},//Object类型,返回值必须是js对象
                    msg_obj: {type: Object,default: function() {return {name: "DarkRanger",age: "18",}}},//指定这个prop为双向绑定//如果绑定类型不对将抛出一条警告
                    msg_twoway: {type: String,twoWay: true,},//自定义验证,必须是Number类型,验证规则:大于0
                    msg_validate: {type: Number,validator: function(val) {return val > 0;}},//将值转为String类型//在设置值之前转换值(1.0.12+)
                    msg_number2string: {coerce: function(val) {return val + ""}},//js对象转JSON字符串
                    msg_obj2json: {coerce: function(obj) {return JSON.stringify(obj);}},//JSON转js对象
                    msg_json2obj: {coerce: function(val) {return JSON.parse(val);}},},template: '<div>msg_null: {{msg_null}}</div>' + '<div>msg_string:{{msg_string}}</div>' + '<div>msg_number: {{msg_number}}</div>' + '<div>msg_obj:{{"name-->"+msg_obj.name+", age-->"+msg_obj.age}}</div>' + '<div>msg_twoway:<input v-model="msg_twoway"></div>' + '<div>msg_validate:{{msg_validate}}</div>' + '<div>msg_number2String: {{msg_number2string}}</div>' + '<div>msg_obj2json: {{msg_obj2json}}</div>' + '<div>msg_json2obj:{{"name: "+msg_json2obj.name+"; age: "+msg_json2obj.age}}</div>'});var dr06 = new Vue({el: "#dr06",data: {telphone: "0356-1234567",mobilephone: 15912345678,dr: {name: "DarkRanger",age: 25},drJson: '{"name":"DarkRanger","age":25}',}})</script></body></html>
复制代码

这篇关于Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930910

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)