vue 组件
  • 组件化开发:把页面上可重用的 UI 结构封装为组件,从而方便项目的开发和维护,组件的后缀名是 .vue。
  • . vue 组件的三个组成部分
  • template : 组件的模板结构(必须包括)
  • script :组件的 JavaScript 行为(可选)
  • style :组件的样式(可选)
  • 组件实例:
//需要在main.js中导入:import Test from './Test.vue'
//同时将main.js中的render指向Test

//Test.vue代码:
<template>
  <div class="test-app">
    <h1>用户定义: --- {{ username }}</h1>
  </div>
</template>


<script>  
export default {
  //vue组件中的data不能使用之前的方式指向对象,data必须是个函数
  data() {
    //return出去的{}中,可以定义数据
    return {
        username: 'lizhi'
    }
  }
}
</script>

<style>   //启用less语法:<style lang="less">

.test-app{
    background-color: pink;
}
</style>

ps: template中只能有唯一的根节点

使用组件
  • 三个步骤(举例是在components目录下创建Left.vue和Right.vue)
  • 步骤1:使用 import 语法导入需要的组件
  • 步骤2:使用 components 节点注册组件
//1,2步骤在APP.vue中
<script>
// 1. 导入需要使用的 .vue 组件
import Left from '@/components/Left.vue'
import Right from '@/components/Right.vue'

export default {
  data() {
    return {
      flag: true
    }
  },
  // 2. 注册组件
  components: {
    Left,
    Right,
  }
}
</script>
  • 步骤3:以标签形式使用刚才注册的组件
//template中   
<div class="box">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <!-- 3. 以标签形式,使用注册好的组件 -->
      <Left></Left>
      <Right></Right>
    </div>
  • 通过components注册的是私有子组件,不能在其他组件使用;可以在 vue 项目的 main.js 入口文件中,通过 Vue.component() 方法,可以注册全局组件:
//创建了Count.vue
// 导入需要被全局注册的那个组件
import Count from '@/components/Count.vue'
Vue.component('MyCount', Count)
组件的props属性
  • props 是组件的自定义属性,在封装通用组件的时候,合理地使用 props 可以极大的提高组件的复用性。
<script>
export default {
  // 自定义属性的名字,是封装者自定义的(只要名称合法即可)
  // props 中的数据,可以直接在模板结构中被使用
  
//props中的数据是只读的
  props: ['自定义属性A','自定义属性B'...]
  
  data(){
      return{}
  }
}
</script>
  • props用属性写法:
props: {
    // 自定义属性A : { /* 配置选项 */ },
    // 自定义属性B : { /* 配置选项 */ },
  ......
    init: {
      // 默认值default
      default: 0,
      
          // 设置值类型必须是 Number 数字,否则报错
      type: Number,
      
          // 表示必填项校验
      required: true
    }
组件之间的样式冲突
  • 默认情况下,写在 .vue 组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题。原因是:
    ① 单页面应用程序中,所有组件的 DOM 结构,都是基于唯一的 index.html 页面进行呈现的
    ② 每个组件中的样式,都会影响整个 index.html 页面中的 DOM 元素
  • 解决方法:vue 为 style 节点提供了 scoped 属性,为组件样式都添加属性选择器[data-v-xxx]
  • /deep/ 样式穿透
    如果给当前组件的 style 节点添加了 scoped 属性,则当前组件的样式对其子组件是不生效的。如果想让某些样式对子组件生效,可以使用 /deep/ 深度选择器。简单来说,就是在样式前生成[data-v-xxx].