4-1 组件使用中的细节点
- 子组件中的data使用function函数return值
- is属性:解决标签规范造成的bug(如table、ul、select内)
- 非根组件中data必须是函数,返回一个对象(为了保证每一个子组件数据的唯一性,避免多个子组件数据共享)
- 操作dom:通过在标签上加ref属性,可通过this.$refs.xxx取得该dom节点,如果是在组件上添加了ref属性,则取得的是该组件的引用
- 元素里的属性不加冒号表示后面是个字符串,否则表示后面是个js表达式
- 冒号是v-bind的缩写,所以在使用上,一般的常量属性我们不用添加冒号;如果是会产生变化的值则要加上冒号。
4-2 父子组件间的数据传递
-
父—>子:
父组件v-bind:变量名=“js表达式”
子组件:props获取
子组件不能直接修改父组件传递来的参数,因为单项数据流,修改Object的值会导致别的引用了该对象的子组件内数据的变化,通过在子组件内复制一份该对象,修改子组件内自己的data来代替
-
子->父:
通过事件形式来传递
子组件:
this.$emit('事件名',传递的参数);
父组件:
监听 @事件名="方法名"
方法名(value){
....
//value=传递来的参数
}
-
:counter
加了冒号表示是数字,不加冒号表示字符串
4-3 组件参数校验与非props特性
-
组件参数校验:
参数校验:子组件对父组件传来的参数做限制
child全局组件 父组件
content='hello world'
props写成对象,值可以是字符串,数组,对象
required:true必传
type:String值的类型
default:'',默认值
validator:function(){return}校验器
-
props 特性:父组件向子组件传递一个属性,子组件通过 props 声明了相应属性进行接收,在 DOM 中不会显示该属性。
-
非props特性:父组件向子组件传递一个属性,子组件没有通过 props 声明相应属性进行接收: a. 子组件中无法使用父组件传递过来的值
b. 在 DOM 中会显示该属性和对应的属性值
4-4 给组件绑定原生事件
-
组件上绑定原生事件:
1、在父组件绑定事件(如@click.native="handle")
2、在vue实例中的methods下定义事件函数。
-
传统方法绑定事件为:
1、在子组件上绑定事件
2、在子组件中的methods设置相应的事件函数,并在函数中设置自定义事件函数,将自定义事件传递给父组件
3、在父组件上绑定从子组件methods函数中传来的自定义事件
4、在父组件methods中设置对应的事件函数。
4-5 非父子组件间的传值
非父子组件间的传值:
- Vuex
- 总线机制(Bus / 发布订阅模式 / 观察者模式):
Vue.prototype.bus = new Vue();
让原型属性 bus 指向一个 Vue 实例,让其充当非父子组件之间传值的桥梁,相当于计算机各种功能部件之间传送信息的公共通信干线(总线 Bus)
- 给 Vue 类加上原型属性 bus, 这样每个 Vue 实例都能访问到原型属性 bus
- 利用 bus 的实例方法 $emit 触发事件
- 再利用生命周期方法(钩子) mounted 给 bus 绑定监听函数, 在事件触发时执行
4-6 在Vue中使用插槽
插槽(slot):
-
作用:父组件可以优雅的向子组件传递dom,方便维护
slot:在父组件中直接写要插入的dom,在子组件的template中 用
<slot>默认内容</slot>这个标签来替换父组件中的dom注意:可以在slot中定义默认值
-
具名插槽:
父组件传给子组件2个插槽,在父组件的标签上分别为slot="a" slot="b"
在子组件的template的slot标签中:
<slot name="a"></slot><slot name="b"></slot>
注意:插槽只有1个,具名插槽可有多个,都有默认值
4-7 作用域插槽
-
使用场景:
由外部(父组件)指定子组件 template 中循环列表的结构(因为子组件可复用,每次使用时的需求可能不同)
-
使用方式:
子组件标签内用 template 标签包裹【固定写法】插入插槽的数据(DOM),且指定一个 slot-scope 属性(属性的值可以随便定义)来接收子组件 slot 标签传递过来的数据,然后使用该数据定制插槽的内容
-
新语法:
2.6.0+ 具名和作用域插槽引入一个新的语法 (v-slot 指令)。取代 slot 和 slot-scope ...详见官方文档教程的插槽部分
4-8 动态组件和v-once指令
-
<component>是vue自带的动态标签<component :is="type">根据type的值变换为相应的组件如果点击按钮前是type=“one”则会显示vue.component(“one”,{})这个组件
如果点击前按钮是type=“two”则会显示vue.component(“two”,{})这个组件
-
v-once只对内部渲染一次,如果模板发生变化,也不会理会
6-4 单文件组件和Vue中的路由
- 路由就是根据网址的不同,返回不同的内容给用户
<router-view/>显示的是当前路由地址所对应的内容
6-5 单页应用vs多页应用
- 多页面应用
每次页面跳转,后端返回一个新的 HTML
优点:首屏时间快(页面首个屏幕的内容展现速度),SEO 效果好(搜索引擎可以识别首页中的跳转其它页面的链接)
缺点:页面切换慢(每次跳转页面需发送 HTTP 请求)
- 单页面应用
JS 感知路由(URL)变化,动态清除页面内容并将新页面的内容挂在到页面上(JS 渲染),此时由前端实现路由
优点:页面切换快
缺点:首屏时间慢,SEO差
- 在vue中不使用
<a>标签进行页面跳转,使用<router-link>标签进行页面跳转<router-link to="/list">列表页</router-link>其中to="" 相当于href=""
6-6 项目代码初始化
上传git
git add . 添加到缓冲区
git commit -m ''缓冲区代码提交到本地仓库
git push推送到线上仓库