vue组件化

1、什么是组件化?

在这里插入图片描述

2、vue的组件化思想

在这里插入图片描述

3、注册组件的基本步骤

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

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

  <script src="../js/vue.js"></script>
  <script>
    // 1、创建组件构造器
    const cpnC = Vue.extend({
      template: `
        <div>
          <h1>标题</h1>
          <h2>内容</h2>
          <h2>内容</h2>
          <hr></hr>
        </div>
      `
    })
    // 2、注册组件
    Vue.component('my-cpn',cpnC);

    const app = new Vue({
      el: '#app',
      data: {
        message:'你好'
      },
      methods: {
      
      }
    });
  </script>
</body>

</html>

4、注册组件步骤解析

在这里插入图片描述
在这里插入图片描述

5、全局组件与局部组件

5.1、全局组件

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

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

  <div id="app2">
    <cpn></cpn>
  </div>
  <script src="../js/vue.js"></script>
  <script>
    // 1、创建组件构造器
    const cpnC = Vue.extend({
      template:`
        <div>
          <h1>标题</h1>
          <p>内容</p>
        </div>
      `
    })
    //2、注册组件(全局组件,意味着可以在多个vue的实例下使用)
    Vue.component('cpn',cpnC)
    
    const app = new Vue({
      el: '#app',
      data: {
        message:'你好'
      },
      methods: {
      
      }
    });
    const app2 = new Vue({
      el: '#app2',
      data: {
        message:'你好'
      },
      methods: {
      
      }
    });
  </script>
</body>

</html>

在这里插入图片描述

5.2、局部组件

在这里插入图片描述
在这里插入图片描述

6、父组件与子组件

6.1、父子组件的写法

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <div id="app">
    <cpn2></cpn2>
  </div>

  <script src="../js/vue.js"></script>
  <script>
    // 1、创建子组件
    const cpnC1 = Vue.extend({
      template: `
        <div>
          <h1>标题1</h1>
          <p>子组件1内容</p>  
        </div>
      `
    })
    // 1、创建父组件
    const cpnC2 = Vue.extend({
      template:`
      <div>
        <h1>标题2</h1>
        <p>子组件2内容</p>
        <cpn1></cpn1>  
      </div>
    `,
    components: {
      cpn1: cpnC1
    }
    })
    const app = new Vue({
      el: '#app',
      data: {
        message:'你好'
      },
      methods: {
      
      },
      components:{
        cpn2: cpnC2
      }
    });
  </script>
</body>

</html>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

6.2、父子组件的错误用法

在这里插入图片描述

6.3、注册组件的语法糖写法

在这里插入图片描述

  • 注册全局组件语法糖写法
    在这里插入图片描述
  • 注册局部组件语法糖写法
    在这里插入图片描述
<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <div id="app">
    <cpn1></cpn1>
    <cpn2></cpn2>
  </div>

  <script src="../js/vue.js"></script>
  <script>
    // 全局组件注册的语法糖写法
    // 1、创建组件构造器
    // const cpn1 = Vue.extend();

    // 2、注册全局组件语法糖写法
    Vue.component('cpn1',{
      template: `
          <div>
            <h1>标题(全局组件)</h1>  
            <h1>内容(全局组件)</h1>  
          </div>
      `
    })
    const app = new Vue({
      el: '#app',
      data: {
        message:'你好'
      },
      methods: {
      
      },
      // 注册局部组件语法糖写法
      components: {
        cpn2: {
          template: `
            <div>
              <h1>标题(局部组件)</h1>  
              <h1>内容(局部组件)</h1>  
            </div>
          `
        }
      }
    });
  </script>
</body>

</html>

在这里插入图片描述

7、组件模板抽离的两种写法

在这里插入图片描述

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

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

  <!-- 1、将模板代码写到script标签中 -->
  <!-- <script type="text/x-template" id="cpnC1">
    <div>
      <h1>标题</h1>
      <p>内容</p>
    </div>
  </script> -->

  <!-- 2、写道template标签中 -->
  <template id="cpnC1">
    <div>
      <h1>标题</h1>
      <p>内容</p>
    </div>
  </template>
  <script src="../js/vue.js"></script>
  <script>
    // 注册组件
    Vue.component('cpn1',{
      template: '#cpnC1'
    })
    const app = new Vue({
      el: '#app',
      data: {
        message:'你好'
      },
      methods: {
      
      }
    });
  </script>
</body>

</html>

在这里插入图片描述

8、组件可以访问vue实例吗

在这里插入图片描述

9、组件数据的存放

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

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

  <!-- 1、将模板代码写到script标签中 -->
  <!-- <script type="text/x-template" id="cpnC1">
    <div>
      <h1>标题</h1>
      <p>内容</p>
    </div>
  </script> -->

  <!-- 2、写道template标签中 -->
  <template id="cpnC1">
    <div>
      <h1>{{title}}</h1>
      <p>内容</p>
    </div>
  </template>
  <script src="../js/vue.js"></script>
  <script>
    // 注册组件
    Vue.component('cpn1',{
      template: '#cpnC1',
      data(){
        return {
          title: 'abc'
        }
      }
    })
    const app = new Vue({
      el: '#app',
      data: {
        message:'你好'
      },
      methods: {
      
      }
    });
  </script>
</body>

</html>

在这里插入图片描述

10、为什么组件data必须是函数

10.1、不是函数的情况

组件data不是函数的情况,代码如下。当点击了页面任何一个按钮,其他两个组件也会受到影响。

在这里插入图片描述
在这里插入图片描述当data不是函数时:
在这里插入图片描述可以看如下函数的创建过程:
在这里插入图片描述

10.2、是函数的情况

data是函数的情况,点击按钮时,只会影响该组加,不会影响其他区组件。
在这里插入图片描述

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

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

  <template id="cpn1">
    <div>
      <h1>计数器:{{counter}}</h1>
      <button @click="increment">+</button>
      <button @click="decrement">-</button>
    </div>
  </template>
  <script src="../js/vue.js"></script>

  <script>
    // const obj = {
    //   counter:0
    // }

    Vue.component('cpn',{
      template: '#cpn1',
      data(){
        return {
          counter: 0
        }
      },
      // data(){
      //   return obj
      // },
      methods: {
        increment(){
          this.counter++
        },
        decrement(){
          this.counter--
        }
      }
    })

    const app = new Vue({
      el: '#app',
      data: {
        message:'你好'
      },
      methods: {
      
      }
    });
  </script>
</body>

</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值