目录

VUEday04-组件的生命周期组件之间的数据共享ref引用购物车案例

【VUE】day04-组件的生命周期、组件之间的数据共享、ref引用、购物车案例

1. 组件之间的关系

https://i-blog.csdnimg.cn/direct/af1c7b892d1a48ecb25c02adb835cebb.png

2. 使用组件的三个步骤

步骤一:使用import语法导入需要的组件

import Left from '@/components/Left.vue'

步骤二:使用component节点注册组件

<script>
// 1. 导入需要使用的 .vue 组件
import Left from '@/components/Left.vue'
import Right from '@/components/Right.vue'
import Test from '@/components/Test.vue'

export default {
  data() {
    return {
      flag: true
    }
  },
  // 2. 注册组件
  components: {
    Left,
    Right,
    Test
  }
}
</script>

步骤三: 以标签的形式使用刚才注册的组件

<template>
  <div class="app-container">
    <h1>App 根组件</h1>

    <button @click="flag = !flag">Toggle Flag</button>
    <Test info="你好" v-if="flag"></Test>

    <hr />

    <div class="box">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <!-- 3. 以标签形式使用注册好的组件 -->
      <Left></Left>
      <Right></Right>
    </div>
  </div>
</template>

@路径提示的插件

https://i-blog.csdnimg.cn/direct/4c2afd1f3d65491ab79bd92c9f034a6b.png

3. vue.components全局注册组件

通过components注册的是私有子组件

例如:

在组件A的components节点下,注册了组件F。

则组件F只能用在组件A中,不能用在组件C中。


注册全局组件

在vue项目的main.js入口文件中,通过vue.component()方法,可以注册全局组件。示例代码如下

https://i-blog.csdnimg.cn/direct/7afe4ce1630c47f4a1e7ffeccafdea54.png

4. 自动生成右边标签插件

https://i-blog.csdnimg.cn/direct/f1bad07f873c4327af3580ae9f7da638.png

5. 组件的props

props是组件的自定义属性,在封装通用组件的时候,合理地使用props可以极大的提高组件的复用性!

https://i-blog.csdnimg.cn/direct/1d19f9b4318a4f49b9ff893601a429d8.png

https://i-blog.csdnimg.cn/direct/e08009c8126a408094c185e4018a84ea.png

6. 结合v-bind使用自定义属性

https://i-blog.csdnimg.cn/direct/9282513fb5a4469380af86b4e23fd108.png

props的值赋值给cout

https://i-blog.csdnimg.cn/direct/df9505433e6c4e8ea9208009d9747698.png

https://i-blog.csdnimg.cn/direct/91429d349e7447229e88b0b503ab0a66.png

7. props的默认default值

在生命自定义属性时,可以通过default来定义属性的默认值,示例代码如下:

https://i-blog.csdnimg.cn/direct/66951ddd6749407db1e12740d82bc71d.png

8. type值类型

在声明自定义属性时,可以通过type来定义属性值的值类型。代码如下:

https://i-blog.csdnimg.cn/direct/363284fdc22d412c8710212c50e95ed4.png

<template>
  <div>
    <h5>Count 组件</h5>
    <p>count 的值是{{ count }}</p>
    <button @click="count += 1">+1</button>

    <button @click="show">打印 this</button>
  </div>
</template>

<script>
export default {
  // props 是"自定义属性",允许使用者通过自定义属性,为当前组件指定初始值
  // 自定义属性的名字,是封装者自定义的(只要名称合法即可)
  // props 中的数据,可以直接在模板结构中被使用
  // 注意:props 是只读的,不要直接修改 props 的值,否则终端会报错!
  // props: ['init'],
  props: {
    // 自定义属性A : { /* 配置选项 */ },
    // 自定义属性B : { /* 配置选项 */ },
    // 自定义属性C : { /* 配置选项 */ },
    init: {
      // 如果外界使用 Count 组件的时候,没有传递 init 属性,则默认值生效
      default: 0,
      // init 的值类型必须是 Number 数字
      type: Number,
      // 必填项校验
      required: true
    }
  },

  data() {
    return {
      // 把 props 中的 init 值,转存到 count 上
      count: this.init
    }
  },
  methods: {
    show() {
      console.log(this)
    }
  }
}
</script>

<style lang="less"></style>

9. 组件之间的样式冲突问题

默认情况下,写在.vue组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题。

导致组件之间样式冲突的根本原因是:

① 单页面应用程序中,所有组件的DOM结构,都是基于唯一的index.html页面呈现的。

② 每个组件中的样式,都会影响整个index.html页面中的DOM元素。

解决办法:

方法1:

https://i-blog.csdnimg.cn/direct/59263baa11204d1cb388ca2a301b3d02.png

方法二:加上scoped

https://i-blog.csdnimg.cn/direct/79a828a4f715452db3bfecced0dde15b.png

方法三:deep

<template>
  <div class="left-container">
    <h3>Left 组件</h3>
    <hr />

    <MyCount :init="9"></MyCount>
  </div>
</template>

<script>
export default {}
</script>

<style lang="less" scoped>
.left-container {
  padding: 0 20px 20px;
  background-color: orange;
  min-height: 250px;
  flex: 1;
}

h3 {
  color: red;
}

// h5[data-v-3c83f0b7]
// [data-v-3c83f0b7] h5

// 当使用第三方组件库的时候,如果有修改第三方组件默认样式的需求,需要用到 /deep/
/deep/ h5 {
  color: pink;
}
</style>

https://i-blog.csdnimg.cn/direct/169e4c77ce734d59a66cf2eab2fc7754.png

10. 组件的生命周期

生命周期(Life Cycle)是指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段。

https://i-blog.csdnimg.cn/direct/786ffef1a71d4c08b0919d3edfd22bce.png

10.1 了解beforeCreate和created生命周期函数的特点

文档地址:

下图展示了实例的生命周期。你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高。

https://i-blog.csdnimg.cn/direct/3d6694d4d0bb411380fc22040fbc7764.png

P18 TODO