组件的概念就不再多说了
那什么是子父组件呢?
父子组件是一个相对概念
A组件使用了B组件 那么 A 就是B的父组件 B就是A的子组件
B组件使用了A组件 那么 B 就是A的父组件 A就是B的子组件
子父组件如何实现通信问题?
简单来说就是两句话(还有多种方法这里就不写l):
父传子 其实就是通过自定义属性 子组件通过props接收
子传父 其实就是通过自定义事件 子组件通过$emit触发父组件定义的事件 并且把子组件的数据
通过参数的方式给了父组件;
那么下面拿案例来说明:
要求:现要实现一个动态投票组件,点击支持,支持人数加一,总人数加1;点击反对,反对人数加一,总人数加一;支持率动态变化 支持率 = 支持人数/总人数
实现原理:基于props属性传递
1.父组件调用到的时候,可以使用自定义属性传值:
自定义属性传递的属性值默认都是字符串,如果需要传递其它数据类型值,
我们需要基于v-bind处理 => :supnum="10" 这样传递过去的就是Number类型,就是前面加个:
<my-component aa='zhufeng' :bb='xxx'></my-component>
2.子组件中基于props声明需要接收的属性值:
Vue.component('my-component',{
props:['aa','bb'],
...
})
使用props需要注意:
-
props中声明的属性和data一样,是响应式数据,挂载到vm实例上,可控制视图渲染
-
props中的一些细节问题
-
命名大小写:传递的是kebab-case格式,props中获取的是camelCase驼峰命名
-
指定属性的类型:props:{xxx:String,…}
-
指定属性的默认值:props:{xxx:{type:String,default:’xxx’,required:true}}
-
type如果是一个数组,意为指定的多类型皆可以
-
default可以是一个函数,函数返回值是默认值
-
validator自定义验证规则函数:必须符合函数中指定的规则,返回true/false
-
-
传递的属性值默认都是字符串格式,如果想要让传递的值是数字、布尔、数组、对象等格式,我们需要使用v-bind处理
-
在组件上添加样式和class自动合并问题
-
案例效果图:
具体代码实现:
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.css">
<title>title</title>
<!-- IMPORT CSS -->
<link rel="stylesheet" href="css/reset.min.css">
<link rel="stylesheet" href="node_modules/bootstrap/dist/css/b