父子组件传值
一、现在开发模式遇到的问题:
问题:现在vue的项目,开发模式有一个大的缺陷
原生的vue项目的目录如下
1.assets //存放静态文件, 2.components //非页面级组件 3.page //存放页面姐组件 4.router // 存放 路由接口 5.index.html //进行控制根节点页面显示。
缺陷是什么?
一个组件需要三个文件进行控制
创建一个新的组件的时候还要注意 控制好class 值,避免多个组件中的class 值有冲突。
Vue compontent("组件名称",配置)
进行配置的时候,都会重复(每一个组件都需这个样子做),
配置过程中要通过axios的配置进行获得创建组件的内容。同时还要在 index.html中创建
一个 <style></style>标签,把样式添加到hearde 标签里面。
(配置这两个的原因是因为 如果不这个样子写的话,就要在index.html页面中引入三个页面
这个样子就会让 index.html页面很难受。所以必须要这个样子写)
二、命名法:
1 1. pascal命名法:YueXiaoTing 2 2.Camel(骆驼)命名法: yueXtingTing 3 3.Kebab-case /ki baeb/ 短横线命名法 yue-xiao-ting
二、1、父子组件传值 有三处命名柜子规定:
第一:在子props中如果一个键 是由两个单词组合而成的,命名规则要遵循骆驼命名法
在子的 html中 使用 的时候 和 props的使用方法一样
第二:在父亲使用的时候要和子props命名相对应,但是名称必须是遵循 短横线命名法
第三 :就是在查看错误的时候,所有的组件,浏览器自动统称为一个名字,
这就会造成不容易查错误。所以
在配置的时候就要 声明一个 name属性 name: 'pascal命名法:YueXiaoTing'
二.2、为什么要研究父子传值问题:
不管是什么开发语言,都要和后端开发人员要有联系。从而进行控制页面操作。
所以要解决 传值问题。
在开发过程中可能有些地方是重复使用的,这个样子我们就可以把一些重复操作的封装成一个组件。
组件的含义一定要牢记: 就是把一堆 html 代码封装起来,起一个名字,反复使用,简单的直接拿那个生成的标签使用
复杂的东西就需要进行传参。
生成的标签 只有 “vue” 才能读懂的 “biao签” ,这个标签名称我们可以随便一名字。
无论是 全局注册 还是 局部注册。
那么父子组件要解决那些问题:
1.父亲给子传值 传属性 传事件 在自己发明的标签中能不能在标签中间存放 html代码。
2.子组件给 父亲传值
对比: 普通标签 可以进行绑定事件 可以传一个属性 可以进行传值,可以在标签内容进行传输内容
<div @click = "" :clss = "Islogin" id = "item.id">
<span>在div里面传内容</span>
</div>
举例解决问题:
这个案例 重要点:
传值之后你希不希望 子进行改变
比如 购物车和详情页都有一个数量加减
所以就给这个重复使用的数量加减创建 一个组件
1.创建这个组件的名字为 mi-count 2.谁使用这个局部组件 谁就是它的父组件。
2.创建局部组件的时候要进行分析。比如父亲需不需给子进行传值,需不需要让子组件关太多
分析之后: 父亲需要给这个 封装好的组件 传 一个count 值
一般情况 我们都认为需要把id也传给子组件对不对,但是有些情况是不需要的
为什么:因为 我只需要进行加减,我并不知道下一步要进行一些什么操作,
而且每一个父亲调用我的时候,每一次操作都会不一样,
这个样子就会让我这个子组件有一定的负担。
3.传值以后
1.你传给我一个加函数和一个减函数事件 然后我去调
2.只要我进行加或者减 我就给你发送一个事件,然后你接受事件之后你想干什么就干什么。
所以父亲在使用的时候就会知道我会发送两个事件。
创建一个文件夹 mi-count
然后创建三个文件
html页面
1 <div> 2 //要取消默认行为 3 <button :disabled ="count === 1" @click.prevent ="decreaseHandler">-</button> 4 //使用 props 中的值和使用data一样。 5 <span v-text= “count”></span> 6 <button :disabled = "count ==== maxCount" @click.prevent ="increaseHandler">+</button> 7 </div>
在js 页面
1 var miCount = (function(){ 2 var componentConfig = { 3 name: "", //在调试的是就可以看到哪一个问题出错。 4 //这个地方起名字就要使用 psk命名法。 5 //todo.... 6 //这个节点用于组件对外的属性,父组件可以用对外公开的属性向当前组件传值 7 这个命名一定要骆驼命名法。 8 命名法的:三种 9 在父亲中使用调的时候需要要使用 短横线 10 //props:[“count”,"maxCount"], 比下面复杂 一般写西面 11 //是对外公共 不要和data里面重名。要不然会出错。 12 props:{ 13 count:{ 14 type:Nuber, 15 //必传 16 required:true 17 }, 18 //只有一个的时候可以写成这个样子 19 //maxCount:Number, 20 maxCount:{ 21 type:Number, 22 //可以不必传,如果不传我就用默认的,如果传我就使用你传的值 23 default:5 24 } 25 }, 26 methods:{ 27 es6的写法,要发送事件,这个样子父组件才能使用 28 increaseHandler(){ 29 //$emit 是发射的意思。 30 this.$emit("increase",100); 31 32 this.$emit("increase",传参10); 33 //这个是对sycn托管的的使用,并不会对没有cscmde 进行任何影响。 34 this.$emit("update:count",count+1); 35 }, 36 decreaseHandler(){ 37 //里面的名字就是 父组件调用或者函数的名字 38 this.$emit("decrease"); 39 this.$emit("update:count",count-1); 40 } 41 } 42 43 44 }; 45 //这个就是把 html css 放在这个地方 46 return vue.conponent("",function(){ //公共的需要起一个名字 47 //这个有问题,所以要使用上面这个问题(将来使用的使用的时候就用下面这个) 48 return vue.extend(function(){ // 局部注册这个不需要起,谁用我谁就自己起名字。 49 50 }); 51 52 }).
父亲使用:
1 //这个是你希望 我这个子来进行修改
<mi-count :count.sync ="item.count" :max-count = "7" @increase = "increaseHandler(item.id)" @decrease ="decreaseHandler(item.id)"></mo-count> 2 如果子也传过来一个参数。 就写一个箭头函数 3 只要传子,父本身不传 就是事件对象 4 <mi-count :count.sync ="item.count" :max-count = "7" @increase = "increaseHandler" @decrease ="decreaseHandler(item.id)"></mo-count> 5 <mi-count :count.sync ="item.count" :max-count = "7" @increase = " increaseHandler(item.id,$evebn)" @decrease ="decreaseHandler(item.id)"></mo-count> 6 7 <mi-count :count.sync ="item.count" :max-count = "7" @increase = " e= >increaseHandler(item.id,e)" @decrease ="decreaseHandler(item.id)"></mo-count> 8
如果你不希望我修改的话,就不要 加 sync
js 页面
1 //一定要加 : 如果不加 : 的话,就会传的是一个字符串。 2 //如果加:就会当成一个js类型去接卸,解析为最后的属性。 3 1.在父亲的中就应该有一个 methods :{ 4 increaseHandler(num){ 5 console.log(num); //这个就是实现了子传父的操作。 6 }, 7 decreaseHandler(){} 8 } 9 10 2.在使用我的时候还要给我传一个值 那个值就是 count 11 所以在父亲里面还需要有一个
data(){ 12 //这个名字叫什么都无所谓。,要把或者这个名字传给我 13 count : 1 14 } 15 3.通过分析需要传给我一个最大值,如果不传给我一个最大值,那么就需要有一个默认的最大值。 16 我知道内部知道maxCount 的最小值是1 最大值的默认值是5, 如果父组件告诉我最大值,我就用父组件告诉我的。 17 18 有的组件 可以直接拿到组件的名字就可以使用,有的组件就需要父子传值操作。 19 黄是购物车 需要发ajax 只能用不能改 20 商品详情不需要进行 加减真正操作。 21 我给你一个数,后期维护 我就不管了. 22 这个sync就是我这个子可以改,如果不加的sync的话,就说明我这个子是不可以改的。 23 要慎重使用,会乱 24 <mi-count :count.sync = "count" max-count= "这个是传的属性"></mi-count> 25 data(){ 26 count: count 27 }

浙公网安备 33010602011771号