388 vue 之 props: 只读,prop的大小写,prop的类型,prop的校验

您所在的位置:网站首页 vue组件中的name属性命名首字母大写报错 388 vue 之 props: 只读,prop的大小写,prop的类型,prop的校验

388 vue 之 props: 只读,prop的大小写,prop的类型,prop的校验

2023-09-30 15:37| 来源: 网络整理| 查看: 265

十、props 的特点 : 只读 演示验证 props 只读 传的是简单类型 : 修改会报错 传的复杂类型 (地址) : 修改不会报错,是因为地址没有变 ,测试 obj={}立马报错 【修改对象中的数据,不会修改对象的地址,但是修改对象的地址就报错。】 修改父组件传给子组件的数据

思路 : 把接收过来的数据,保存到 data 中一个临时值 (适用在该组件接收数据只会在当前组件内使用)

Vue.component('child', { template: ` 子组件 {{ cmsg }} `, data() { return { cmsg: this.msg } }, props: ['msg'], created() { this.cmsg = 666 } })

完善TodoMVC => 修改状态 + 修改任务

08-prop的只读特性.html

Document Vue.component('child', { template: ` 子组件 : {{ obj.name }} `, props: ['msg', 'obj'], mounted() { // 修改传递过来的数据 // 1. 修改基本类型的数据,报错 // this.msg = 666 //2. 只是改了对象里的内容 ,并没有改地址 // this.obj.name = '春春' // 虽然这不会报错,但是也不要这么改 this.obj = {} // 这样写报错 } }) const vm = new Vue({ el: '#app', data: { pmsg: '父的信息', pobj: { name: '张三' } } })

补充的案例

Document Vue.component('one', { template: ` {{msg}} - {{obj.name}} {{cMsg}} - {{cObj.name}} `, data() { return { // 把接收过来的数据,保存到 data 中一个临时 cMsg: this.msg, cObj: this.obj } }, props: ['msg', 'obj'], created() { this.cMsg = 333 this.cObj.name = '嘻嘻' this.cObj = { name: '嘿嘿' } }, }) const vm = new Vue({ el: '#app', data: { pMsg: '111', pObj: { name: '哈哈' } } })

十一、prop 的大小写

官 : HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。

html 的标签和 属性 都是一样,忽略大小写 我是h1

官 : 这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名不好使了

会报警告,父传子也接收不到了 原因是 : 接收的属性是:cMsg, 因为忽略大小写,已为 : cmsg 所以已经准备要读取的 是 cmsg 的值,否则要报警告 You should probably use "c-msg" instead of "cMsg".

方式 1 : 全用小写,不要使用驼峰命名 (不推荐)

接收 : cmsg props/读取 :cmsg

方式 2 官 : 需要使用其等价的 kebab-case (短横线分隔命名) 命名: (推荐)

接收 : :c-msg='pmsg' props/读取 : cMsg / this.cMsg

大小写在 父传子和 子传父中的应用 (都是要 带 - 的)

父传子 : :c-msg ==> cMsg 改驼峰 - 因为props 子传父 : @todo-head = 'pAddTodo' ==> this.$emit('todo-head') 不改驼峰

完善 TodoMVC : 底部隐藏+剩余完成数+清除完成

计算属性 : 已知值(todoList 在 根组件) ==> 得到一个新值(子组件里使用) 父 => 子通讯

番外篇 : 方法当属性传、传过来的带:得到的原型

09-prop的大小写问题.html

Document Vue.component('child', { template: ` 子组件 : {{ cMsg }} {{ cUserName }} `, props: ['cMsg', 'cUserName'] }) const vm = new Vue({ el: '#app', data: { pMsg: '父的信息', pUserName: '大傻春' } })

10-大小写问题应用在子传父和父传子.html

Document Vue.component('child', { template: ` 子组件 : {{ cMsg }} `, props: ['cMsg'], created() { this.$emit('add-todo') } }) const vm = new Vue({ el: '#app', data: { pMsg: '父的信息' }, methods: { pAddTodo() { console.log('哈哈') } } })

11-prop的类型问题.html

Document Vue.component('child', { template: ` 子组件 : `, props: ['msg'], created() { // 'abc' => 字符串 // '123' => '123' 字符串 console.warn(this.msg, typeof this.msg) // true "boolean" console.warn(this.na, typeof this.na) // 123 "number" } }) const vm = new Vue({ el: '#app', data: { name: 123 } })

12-类型的校验问题.html

Document // 这个组件是我注册的 Vue.component('child', { template: ` 子组件 : `, props: ['msg'], // props: { // msg: Number // 仅仅是告诉其类型 // }, // props: { // msg: { // type: Number, // 类型 // default: 100 // 默认值 // } // }, created() { // 我希望的是一个数字类型 console.log(this.msg, typeof this.msg) console.log(this.msg + 10) // 133 } }) const vm = new Vue({ el: '#app', data: {} })


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3