[Vue] 组件化开发

这一块很重要,开发中经常用用到

  • 组件化开发
    • 1.1组件化的实现和使用步骤
    • 1.2 全局组件和局部组件
    • 1.3 父组件和子组件的区别
    • 1.4 注册组件的语法糖写法
    • 1.5 组件模板抽离的写法
      • 第一种: 将模板定义在同一文件但是不同script域中 (不常用,不好用)
      • 第二种: 使用``标签 (推荐使用)
    • 1.6 组件的Data为什么需要是一个function
      • 组件数据的存放
      • 为什么必须是一个函数
    • 1.7 父子组件通信
      • 1.7.1 父传子props
      • 1.7.2 props中的驼峰标识
      • 1.7.3 子传父(自定义事件)
      • 1.7.4 子父双向绑定案例
      • 1.7.5 watch属性
      • 1.7.6 父访问子 --- children-refs
      • 1.7.7 子访问父 ---- parent-root
    • 1.8 slot插槽
      • 1.8.1 slot插槽的基本使用
      • 1.8.2 具名插槽的使用
      • 1.8.3 编译作用域的概念
      • 1.8.4 作用域插槽

组件化开发

1.1组件化的实现和使用步骤

  • 任何人在面对复杂问题的处理方式

    • 任何一个人的处理信息的逻辑能力都是有限的
    • 所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大推的内容
    • 但是,我们可以将问题进行拆解
  • 组件化开发也是类似的思想

    • 如果我们将一个页面中所有的处理逻辑全部放在一起,处理起来就会变得十分复杂,而且不利于后续的管理以及拓展
    • 但如果我们将一个页面查分成若干个小的功能块,每个功能块完成属于自己的独立的功能,那么之后整个页面的管理和维护就变得非常容易了
    • vue的组件化思想,让我们可以开发出一个个独立可复用的小组件来构造我们的应用
    • 任何的应用都会被抽象成一棵组件树

[Vue] 组件化开发_第1张图片

  • 组件的使用分成三个步骤:
    • 创建组件构造器
    • 注册组件
    • 使用组件

[Vue] 组件化开发_第2张图片

  • 对于Vue.extend()
    • 调用这个方法创建的是一个组件构造器
    • 通常在创建构造器的地方,传入template代表我们自定义组件的模板
    • 模板就是HTML代码
    • 事实上,上图的写法基本上不用了,我们使用他的语法糖
  • Vue.component()
    • 调用这个方法是将组件构造器注册为一个组件,并且给他起一个组件的标签名称
    • 需要传递两个参数: 1.注册组件的标签名 2. 组件构造器
  • 组件必须挂载在某个Vue实例下,否则他不会生效

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

<div id="app">
    
    
    
    
    <my-cpn>my-cpn>
div>


<my-cpn>my-cpn>

<script src="../js/vue.js">script>
<script>
    //创建构造器对象
    const cpnC = Vue.extend({
      
        template: `

我是标题

我是内容qwq

我是内容23333

`
}) //注册组件 Vue.component('my-cpn', cpnC) let app = new Vue({ el: '#app',//用于挂载要管理的元素 data: { //用于定义数据 } })
script> body> html>

1.2 全局组件和局部组件

全局组件: 组件可以在多个Vue实例中使用

上个案例的代码创建的组件就是全局组件

局部组件: 只能在指定的Vue实例里面使用

注意: 其实在开发中我们一般只创建一个Vue实例

Vue实例中,除了我们之前学习的data,computed,methods属性之外,现在再加上一个属性,components属性,在这里面定义的组件只能在这个Vue实例中使用


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

<div id="app">
    <cpn>cpn>
div>

<script src="../js/vue.js">script>
<script>
    const cpnC = Vue.extend({
      
        //这里的``符号是es6特有的,这个符号括起来的字符串允许换行
        template: `

就是这么自信!

`
}) let app = new Vue({ el: '#app',//用于挂载要管理的元素 data: { //用于定义数据 }, components: { //key是标签名, value是组件构造器 cpn: cpnC } })
script> body> html>

1.3 父组件和子组件的区别

子组件就是在父组件里面注册的组件

除非子组件也在实例中注册了,不然子组件是无法单独引用的

不多bb,直接上例子


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
<div id="app">
    
    <cpn2>cpn2>

    
    <cpn1>cpn1>

div>

<script src="../js/vue.js">script>
<script>
    const cpnC1 = Vue.extend({
      
        template: `

我是儿子!

`
, }); const cpnC2 = Vue.extend({ template: `

我是亲爹!

`
, components: { cpn1: cpnC1 } }); //这个其实也是一个组件,这个是最顶部的组件,叫做Root组件 let app = new Vue({ el: '#app',//用于挂载要管理的元素 data: { }, components: { cpn2: cpnC2, } })
script> body> html>

当然,要是父组件中没有注册子组件,那么要想父组件中的子组件能够正常显示,就必须在Root组件中声明子组件

1.4 注册组件的语法糖写法

注册全局组件的语法糖

Vue.component('cpn1', {
     
            template: `
        

我是你爹

`
}) //直接这样写组件就注册好了,可以直接在Vue实例中调用

第二个参数其实是调用了extend()方法的,只不过被隐藏了

注册局部组件的语法糖

 components: {
            'cpn1': {
                template: `
                           <div>
                               <h2>我是你爹h2>
                           div>
`                                            `
            }

1.5 组件模板抽离的写法

如果像上面那样将HTML模板写在了JS里面,那么其实就是很不好看,所以我们要抽离

第一种: 将模板定义在同一文件但是不同script域中 (不常用,不好用)


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

<div id="app">
    <cpn1>cpn1>
div>




<script type="text/x-template"  id="cpn">
    <div>
        <h2>我是你爹</h2>
    </div>
script>

<script src="../js/vue.js">script>

<script>
    let app = new Vue({
      
        el: '#app',
        components: {
      
            'cpn1': {
      
                template: '#cpn'
            }
        }
    })
script>
body>
html>

第二种: 使用