title: vue文档-基础
date: 2018.9.3
tags:

- vue.js


# B 深入了解组件

2018.9.3 星期一


2018.11.2 星期五 10:28 2nd

A 基础

一 安装

二 介绍

1. Vue.js 是什么
1. 起步
1. 声明式渲染
1. 条件与循环
1. 处理用户输入
1. 组件化应用构建
1. 与自定义元素的关系
1. 准备好了吗?

三 Vue 实例

创建一个 Vue 实例
数据与方法
实例生命周期钩子
生命周期钩子的 this 上下文指向调用它的 Vue 实例。

不要在选项属性或回调上使用箭头函数,因为箭头函数是和父级上下文绑定在一起的,this 不会是如你所预期的 Vue 实例,

生命周期图示
beforeCreate,created, beforeMount,mounted, beforeDestroy,destroyed
beforeUpdate,updated

$PS_react生命周期: constructor,getDerivedStateFromProps,render,componentDidMount,componentWillUnmount, shouldComponentUpdate,getSnapsBeforeUpdate,componentDidUpdate

模板语法

计算属性和侦听器

Class 与 Style 绑定

条件渲染

列表渲染

事件处理

表单输入绑定

组件基础

组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。

为了能在模板中使用,这些组件必须先注册以便 Vue 能够识别。这里有两种组件的注册类型:全局注册和局部注册。至此,我们的组件都只是通过 Vue.component 全局注册的:

0 取而代之的是,一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝:
1 通过 Prop 向子组件传递数据
2 通过事件向父级组件发送消息
Vue 实例提供了一个自定义事件的系统来解决这个问题。我们可以调用内建的 $emit 方法并传入事件的名字,来向父级组件触发一个事件:
$emit 的第二个参数来提供这个值,在父级组件监听这个事件的时候,我们可以通过 $event 访问到被抛出的这个值

<blog-post
  v-for="post in posts"
  v-bind:key="post.id"
  v-bind:post="post"
  v-on:enlarge-text="postFontSize += 0.1"
  v-on:enlarge-text="onEnlargeText" // ### 传递值
></blog-post>
// ### 传递值
methods: {
  onEnlargeText: function (enlargeAmount) {
    this.postFontSize += enlargeAmount
  }
}
// 全局定义
Vue.component('blog-post', {
  props: ['post'],
  template: `
    <div class="blog-post">
      <h3>{{ post.title }}</h3>
      <div v-html="post.content"></div>
      <button v-on:click="$emit('enlarge-text,0.1')"> Enlarge text </button>
    </div>
  `
})

### 在组件上使用 v-model
### 通过插槽分发内容
### 动态组件 is <component v-bind:is="currentTabComponent"></component>
### 解析 DOM 模板时的注意事项
幸好这个特殊的 is 特性给了我们一个变通的办法:
需要注意的是如果我们从以下来源使用模板的话,这条限制是不存在的:

B 深入了解组件

组件注册

全局注册Vue.component 在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。
局部注册 然后在 components 选项中定义你想要使用的组件 注意局部注册的组件在其子组件中不可用,也需要在components选项中定义要使用的组件($PS:全局注册的不需要)

### 模块系统
通过 import/require 使用一个模块系统,
局部注册:然后你需要在局部注册之前导入每个你想使用的组件。
基础组件的自动化全局注册:幸好如果你使用了 webpack (或在内部使用了 webpack 的 Vue CLI 3+),那么就可以使用 require.context 只全局注册这些非常通用的基础组件。

Prop

### 单向数据流
###
### Prop 验证

Vue.component('my-component',{
    props:{
        propA:Number,/[String, Number],/{type:7类型/自定义构造函数,require,default:type/funciton,validator,}
    }
})

### 非 Prop 的特性
一个非 prop 特性是指传向一个组件,但是该组件并没有相应 prop 定义的特性。
因为显式定义的 prop 适用于向一个子组件传入信息,然而组件库的作者并不总能预见组件会被用于怎样的场景。这也是为什么组件可以接受任意的特性,而这些特性会被添加到这个组件的根元素上。
### 替换/合并已有的特性
对于绝大多数特性来说,从外部提供给组件的值会替换掉组件内部设置好的值。庆幸的是,class 和 style 特性会稍微智能一些,即两边的值会被合并起来,从而得到最终的值:
### 禁用特性继承
如果你不希望组件的根元素继承特性,你可以在组件的选项中设置 inheritAttrs: false

自定义事件

### 事件名
同于组件和 prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称。

不同于组件和 prop,事件名不会被用作一个 JavaScript 变量名或属性名,所以就没有理由使用 camelCase 或 PascalCase 了。并且 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的)

因此,我们推荐你始终使用 kebab-case 的事件名。
### 自定义组件的 v-model
### 将原生事件绑定到组件
### .sync 修饰符

插槽

具名插槽: 有些时候我们需要多个插槽。

元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽:
在一个父组件的