程序员社区

组件化

1.基本使用

组件化是Vue.js里面的重要思想
我们可以开发出一个个独立可复用的小组件来构造我们的应用
任何应用都可以抽象为一棵组件树
组件使用的步骤
①创建组件构造器,调用Vue.extend()方法
template后面的内容表示我们自定义的模板
②注册组件,调用Vue.component()方法
需要传两个参数:1.注册组件的标签名 2.组件构造器
③使用组件,组件必须挂载在某个Vue实例下,否则它不会生效

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Title</title>
</head>
<body>
<div id="app">
<!--  3.使用组件-->
  <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>
      <p>人间烟火气</p>
      <p>最是抚人心</p>
    </div>`
  })
  //2.注册组件
  Vue.component('my-cpn',cpnC);
  const app = new Vue({
    el:'#app',
    data:{
      message:'你好啊!'
    }
  })
</script>
</body>
</html>

在这里插入图片描述

PS:template后面的内容是一个字符串类型,用``这个符号括起来的好处是:多行内容之间不需要用‘+’号连接,而用单引号’ '就需要,这是ES6的新语法

2.全局组件和局部组件

上面注册的组件是全局组件,这就意味着可以在多个Vue实例下面使用
怎么定义局部组件?
在创建vue实例的时候,在components属性后面添加定义

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Title</title>
</head>
<body>
<div id="app">
  <cpn></cpn>
  <cpn></cpn>
  <cpn></cpn>
</div>

<script src="../js/vue.js"></script>
<script>
  //1.创建组件构造器对象
  const cpnC = Vue.extend({
    template: `
    <div>
      <p>人间烟火气</p>
      <p>最是抚人心</p>
    </div>`
  })
  const app = new Vue({
    el: '#app',
    data: {
      message:'你好啊!'
    },
    components: {
      cpn: cpnC     //注册局部组件
    }
  })
</script>
</body>
</html>

3.父组件和子组件

在注册组件构造器的时候,在components后面添加

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Title</title>
</head>
<body>
<div id="app">
  <cpn2></cpn2>
</div>

<script src="../js/vue.js"></script>
<script>
  //创建子组件
  const cpnC1 = Vue.extend({
    template: `
    <div>
      <h2>我是组件1</h2>
      <p>哈哈哈</p>
    </div>
    `
  })
  //创建父组件
  const cpnC2 = Vue.extend({
    template: `
    <div>
      <h2>我是组件2</h2>
      <p>嘿嘿嘿</p>
      <cpn1></cpn1>
    </div>
    `,
    components:{
      cpn1:cpnC1
    }
  })
  //root组件
  const app = new Vue({
    el:'#app',
    data:{
      message:'你好啊!',
    },
    components: {
      cpn2: cpnC2,
    }
  })
</script>
</body>
</html>

在这里插入图片描述

4.注册组件的语法糖写法(推荐)

Vue为了简化注册组件的过程,提供了注册的语法糖
主要省去了调用Vue.extend()的步骤,而是直接用一个对象来代替

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Title</title>
</head>
<body>
<div id="app">
  <cpn1></cpn1>
  <cpn2></cpn2>
</div>

<script src="../js/vue.js"></script>
<script>
  //注册全局组件的语法糖
  Vue.component('cpn1',{
    template: `
    <div>
      <p>人间烟火气</p>
    </div>`
  });
  const app = new Vue({
    el:'#app',
    data:{
    },
    components:{        //注册局部组件的语法糖
      'cpn2': {
        template: `
    <div>
      <p>最是抚人心</p>
    </div>`
      }
    }
  })
</script>
</body>
</html>

在这里插入图片描述

5.模板的分离写法

两种方案:
①使用script标签
②使用template标签

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Title</title>
</head>
<body>
<div id="app">
  <cpn1></cpn1>
  <cpn2></cpn2>
</div>

<!--1.使用script标签,注意类型是text/x-template-->
<script type="text/x-template" id="cpnC1">
  <div>
    <p>人间烟火气</p>
  </div>
</script>
<!--2.使用template标签-->
<template id="cpnC2">
  <div>
    <p>最是抚人心</p>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>
  Vue.component('cpn1', {
    template: `#cpnC1`
  })
  const app = new Vue({
    el:'#app',
    components:{
      'cpn2': {
        template: `#cpnC2`
      }
    }
  })
</script>
</body>
</html>

6.组件的data必须是一个函数

组件是一个单独功能模块的封装,不能访问Vue实例中的数据,它有属于自己的data
组件的data必须是一个函数,而且这个函数返回一个对象,对象里面保存着数据

那么为什么后面必须跟一个函数?
如果data后面是一个对象,那么多个组件就会共同拥有一个data,会相互影响,这是我们不愿意看到的,因为每个组件都有自己的功能和逻辑
如果后面是一个函数,函数返回一个对象,那么每一个组件都会拥有一个自己的data,互不影响

代码示例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Title</title>
</head>
<body>
<div id="app">
  <cpn></cpn>
</div>

<template id="cpnC">
  <div>
    <p>天上剑仙三百万</p>
    <p>{{nextPoem}}</p>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>
  Vue.component('cpn', {
    template: `#cpnC`,
    data(){
      return {
        nextPoem: '见我也须尽低眉'
      }
    }
  })
  const app = new Vue({
    el:'#app',
    data:{
      message:'你好啊!'
    },
  })
</script>
</body>
</html>

在这里插入图片描述

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 组件化

一个分享Java & Python知识的社区