vue组件化开发
主要为了把一个大功能拆分成若干个小的功能,解决高耦合问题,同时也方便开发人员维护。
 
从功能上组件可以分为木偶组件和功能组件。
木偶组件(为了接收数据,渲染数据,基本上是没有逻辑的,越往下越木偶)
功能组件(更多是控制数据,有大量的逻辑,越往顶层越功能)
 
组件化开发的优势:
1、提高开发效率
2、方便重复使用
3、便于协同开发
4、更容易管理维护 
 
写法 :
Vue.component(组件名称,对象){}
 
命名规则:
定义组件名的方式有两种
1)短横线方式 my-component
2)首字母大写方式 MyComponent
但是在HTML模板中尽量使用短横线方式
 
关于组件的几个注意事项:
1、必须放在根实例(new Vue)的上面
2、组件名字与引入组件的名字尽量保持一致
3、template顶层只能有一个div盒子
4、在子组件中,data必须为函数,函数值返回一个对象,对象下面挂数据
 
父级传递子级
首先在子组件上加一个v-bind:自定义属性,等于父级的数据
//比如<ppx v-bind:data="arr"></ppx>
//简写<ppx :data="arr">

子组件通过props来接收数据

//props:['data']

最后使用即可

//{{data}}

注意:

自定义属性不要和子组件数据名称一样

props可以为数字,数组时候传字符串
props可以为对象,为了启用高级配置(传入数据类型的检测和设置默认值)
一般使用对象形式
 
<div id="app">
<!-- arr 是父组件的-->
<ppx :data="arr"></ppx>
</div>
  let obj = {
props:['data'],
template:`
<ul>
<li v-for="(val,key) in data">
{{val}}
</li>
</ul>
`,
data(){
return {
val:'我是子组件'
}
}
} Vue.component('ppx',obj);
new Vue({
el:'#app',
data:{
arr:[111,222,333]
}
});

子级传递父级

在子组件上绑定一个自定义事件,并且传入父级的“事件”处理函数
比如 子组件定义<ppx @customev="changC">,其中changC是父组件定义的
在子组件内部监听这个自定义事件,this.$emit('自定义事件名',参数)
比如
 change(){
this.$emit('customev',id,xxx)
}
vue 组件间传递数据为单向数据流动:
父级把数据传给子级,子级拿到数据后渲染页面,但无权修改父组件传递给它的数据
(父组件通过 props 向下传递数据给子组件,子组件通过 $emit触发父组件的自定义事件 给父组件发送消息)
数据从父级流向子级,数据本身还是父级的。
如果操作子级要改变父级的数据,只能通过子级告知父级要操作哪个数据
然后让父级去修改自己的数据,修改完毕再传给子级
比如checkbox复选框,修改他只能让父级修改,不允许子级修改
 
<div id="app">
<h2>父组件</h2>
<input type="text" v-model="val" @keyup.13="add" >
{{arr}}
<h4>子组件</h4>
<ppx :data="arr" @changebool="ck"></ppx>
</div>
 let obj={
props:{
data:{
type:Array,
default:[]
}
},
template:`
<div>
<ul>
<li v-for="(val,key) in data">
<input type="checkbox" @click="changeC(val.id,$event)">
<span>{{val.name}}</span>
</li>
</ul>
</div>
`,
methods:{
changeC(id,ev){
//自定义的changebool事件,触发时候执行ck
this.$emit('changebool',id,ev.target.checked);
}
}
}
Vue.component('ppx',obj);
new Vue({
el:'#app',
data:{
val:'',
arr:[
{
id:0,
name:'巴黎',
checked:false
},
{
id:1,
name:'东京',
checked:false
},
{
id:2,
name:'伦敦',
checked:true
},
{
id:3,
name:'悉尼',
checked:false
}
]
},
methods:{
add(){
this.arr.push({
id:+new Date,//隐式类型转换,可以把字符串转成数字类型
name:this.val,
checked:false
});
this.val = '';
},
ck(id,bool){
this.arr.forEach(e=>{
//如果当前的id 等于 id 就把当前数据的checked 赋给 bool
if(e.id === id){
e.checked = bool;
}
})
}
}
});

另一种方法

如果要让子级有功能(操作父级数据的能力),那么可以把父级传进来的数据变成自己的
子级改变自己的数据,是不会影响父级的数据
注意:

如果父级传进来的数据是复合类型(引用类型)的,那么变成自己的数据时,要深拷贝一下,不然改变子级会影响父级
 
 <div id="app">
<h2>父级的</h2>
<input type="text" v-model="val" @keyup.13="add">
{{arr}}
<hr> <h2>子组件</h2>
<list :data="arr" :k="kk" @getchilddata="changeC"></list>
</div>
  let obj = {
template:`
<div>
<ul>
<li v-for="(val,key) in cd">
<input
type="checkbox"
@change="changeFn(val.id)"
>
<span>{{val.txt}}</span>
</li>
</ul>
{{cd}}
</div>
`,
methods:{
changeFn(id){
let b;
this.cd.forEach(data => {
if(data.id === id){
data.checked = !data.checked;
b = data.checked;
}
}); this.$emit('getchilddata',id,b);
console.log(this.cd); }
},
props:['data','k'],
data(){
return {
cd:JSON.parse(JSON.stringify(this.data))
}
}
} Vue.component('list',obj); new Vue({
el:'#app',
data:{
kk:'变',
val:'',
arr:[
{
id:0,
txt:'小明',
checked:false
},
{
id:1,
txt:'小红',
checked:false
},
{
id:2,
txt:'小刚',
checked:false
}
]
}
,methods:{
add(){
this.arr.push({
id: +new Date,
txt:this.val,
checked:false
});
this.val = '';
},
changeC(id,bool){
this.arr.forEach(e=>{
if(e.id === id){
e.checked = bool;
};
});
}
}
});

vue 组件数据传递的更多相关文章

  1. vue教程3-05 vue组件数据传递、父子组件数据获取,slot,router路由

    vue教程3-05 vue组件数据传递 一.vue默认情况下,子组件也没法访问父组件数据 <!DOCTYPE html> <html lang="en"> ...

  2. React中父子组件数据传递

    Vue.js中父子组件数据传递:Props Down ,  Events Up Angular中父子组件数据传递:Props Down,  Events  Up React中父子组件数据传递:Prop ...

  3. Vue之数据传递

    基础:vue的响应式规则 简单的props更新 父组件 <template> <div> <block-a :out-data="x">< ...

  4. 关于vue.js父子组件数据传递

    vue.js中使用props down,events up的原则进行父子组件间的通信,先来记录下props down,看个例子: <div id="app2"> < ...

  5. vue组件 Prop传递数据

    组件实例的作用域是孤立的.这意味着不能(也不应该)在子组件的模板内直接引用父组件的数据.要让子组件使用父组件的数据,我们需要通过子组件的props选项. prop 是单向绑定的:当父组件的属性变化时, ...

  6. vue 多级组件数据传递

    A包含B组件,B包含C组件   那么A 传递到C 组件可以通过 在B组件中绑定 $attrs 具体代码可以参见github: https://github.com/qiaoqiao10001/vueA ...

  7. vue2.0 父子组件数据传递prop

    vue的一个核心概念就是组件,而组件实例的作用域是孤立的,所以组件之间是不能直接引用其他组件的数据的.极端点举例来说,就是可以在同一个项目中,每一个组件内都可以定义相同名称的数据. data () { ...

  8. Vue2.x中的父组件数据传递至子组件

    父组件结构 template <template> <div> <v-girl-group :girls="aGirls"></v-gir ...

  9. Vue2.x之父子组件数据传递

    父传子,并且通过fatherEvent接收子组件传过来的值 <template> <div class='father'> <Son :fatherData=" ...

随机推荐

  1. opencv 图片缩放

    import cv2 as cv import numpy as np # 图片缩放 img = cv.imread('../images/moon.jpg', flags=1) # flags=1读 ...

  2. Linux内核进程

    公司数据库机器报警进程数高于1500,登进去ps命令看了一下,这么多进程并不认识,就在网上找了一些关于linux进程的资料,如下: idle 进程的pid=0,是由系统自动创建的第一个进程,也是唯一的 ...

  3. 【CF850E】Random Elections(FWT)

    [CF850E]Random Elections(FWT) 题面 洛谷 CF 题解 看懂题就是一眼题了... 显然三个人是等价的,所以只需要考虑一个人赢了另外两个人就好了. 那么在赢另外两个人的过程中 ...

  4. centos7搭建ELK Cluster集群日志分析平台(二):Logstash

    续  centos7搭建ELK Cluster集群日志分析平台(一) 已经安装完Elasticsearch 5.4 集群. 安装Logstash步骤 . 安装Java 8 官方说明:需要安装Java ...

  5. QML-WebEngineView加载html(Echarts绘图)

    实现QML中运用webEngineView加载Echarts GitHub:八至 作者:狐狸家的鱼 本文链接:QML-WebEngineView加载Echarts 一.前言 Qt允许使用混合GUI创建 ...

  6. Macbook外接显示器模糊解决方法

    解决方法(此方法经本人测试失败) 下载这个http://www.elias.cn/uploads/Mac/patch-edid.zip.如果链接失效可以使用https://gist.github.co ...

  7. Manjaro下带供电的USB Hub提示error -71

    问题描述 这款USB Hub是绿联出的1转7带供电的白色款. 在lsusb中显示为 Bus 004 Device 023: ID 05e3:0616 Genesys Logic, Inc. hub B ...

  8. c语言笔记: 对 void *lpObj 进行类型转换时,一不留神,后果很严重

    问题描述: 一个项目之前测试的时候一点问题没有,今天早上软件在一个特定的条件下出现崩溃情况,但并不是每次都会崩溃情,崩溃概率达到80%. 经过上午3个小时的排查,终于找到原因. 在项目中,我使用了一个 ...

  9. CF Educational Codeforces Round 57划水记

    因为是unrated于是就叫划水记了,而且本场也就用了1h左右. A.B:划水去了,没做 C:大水题,根据初三课本中圆的知识,可以把角度化成弧长,而这是正多边形,所以又可以化成边数,于是假设读入为a, ...

  10. 基于django的自定义简单session功能

    基于django的自定义简单session功能 简单思路: 1.建立自定义session数据库 2.登入时将用户名和密码存入session库 3.将自定义的随机session_id写入cookie中 ...