vue组件的使用

一、组件的初步认识

1.1 使用组件的原因?

为了提高代码的复用性。

1.2 组件本质是什么?

可复用的vue实例。 组件需要注册后才可以使用。
分为全局组件和局部组件。 组件体现形式就是页面上的自定义标签。

1.3 全局组件

Vue.component(“标签名”,配置对象);

【注意点】
  1.全局组件必须写在创建实例之前。
  2.每一个组件只有一个根元素。
  3. template标签相当于一个占位符。它在页面中默认是隐藏的。可以帮助我们去创建模板内容。
1.3.1 全局组件的写法:
<!DOCTYPE html>
<html lang="en">

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

<body>
 
  <!-- 全局组件 -->
  <div id="app">
    <v-tab></v-tab>
  </div>

    <template id="zj">
      <div>
        <h1>vue组件化学习</h1>
      </div>
    </template> 
  <script src="./js/vue.min.js"></script>
  
  <script>
 // 3、创建组件配置对象
  let vzujian = {
    template:"#zj"
  }

  //  1、注册全局组件
  Vue.component("v-tab",vzujian);

  // 2、创建vue实例
  let app = new Vue({
    el:"#app",
    
  })

  </script>
 
</body>

</html>

1.4 局部组件的写法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <v-tmp></v-tmp>
    <child></child>
    <v-tab> </v-tab>
  </div>
  <template id="zujian">
    <div>
      <p>我是段落1</p>
      <h1>自定义组件 </h1>
      <p>我是段落2</p>
    </div> 
  </template>

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

  <script>
    // 1、注册局部组件
    let app = new Vue({
      el: "#app",
      components: {
        "v-tab": {
          template: "#zujian"
        }
      }
    })
  </script>
</body>
</html>

二、组件中的data为何是个函数?

在这里插入图片描述

2.2 为何是个函数的解释

1、首先创建一个名字为counter的组件,data函数中返回一个外部定义的对象的值,如果直接给data属性设置一个对象而不是函数,那么会在浏览器中直接报错

2、在浏览器中运行代码
每次点击+1按钮,下边的值就会加一

3、如果我们在页面上同时使用三个counter组件。
点击任意一个+1按钮,三个数同时变化。因为它们都指向了同一个对象。我们当然希望点击不同的按钮只实现当前组件内数据的变化,那么,我们在函数中返回一个对象,每次创建一个组件的时候,在内存中同时开辟一块空间给当前组件存放data,这样,就不会出现共用一个data的现象。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    {{msg}}
    <abc></abc>
    <abc></abc>
    <abc></abc>
  </div>
  <template id="tmp">
    <button @click="add">你点击了{{counter}}次</button>
  </template>
  <script src="./js/vue.min.js"></script>
  <script>
    let data = {
      counter:0
    }
    //1.创建组件的配置对象
    let options = {
      template: `#tmp`,
      data(){
        return {
          counter:0
        };
        return data;
      },
      methods:{
        add(){
          this.counter++;
        }
      }
    }
    //2.注册全局组件
    Vue.component("abc", options);
    let app = new Vue({
      el: "#app",
      data: {
        msg: "app实例"
      },
      methods: {
        say() {
          console.log("拜拜了各位");
        }
      }
    })
  </script>
</body>

三、动态组件

3.1 动态组件写法一

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

<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <button @click="change">切换页面</button>
    <v-home v-if="isShow"></v-home>
    <v-list v-else></v-list>   
  </div>
  
  <script src="./js/vue.min.js"></script>
  <script>
    // 3、配置对象
    let home = {
      template:"<div>主页界面</div>"
    }
    let list = {
      template:"<div>列表页面</div>"
    }

    // 1、注册全局组件
    Vue.component("v-home",home);
    Vue.component("v-list",list);
    // 2、创建vue实例
    let app = new Vue({
      el:"#app",
      data:{
        isShow:true,
      },
      methods:{
        change(){
          this.isShow = !this.isShow;
        }
      }
    })
  </script>
</body>
</html>

3.1 动态组件写法二

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

<body>
  <div id="app">
    <button @click="change">切换页面</button>
    <!-- <v-home v-if="isShow"></v-home>
    <v-list v-else></v-list> -->
    <component v-bind:is="dname"></component>
  </div>
 
  <script src="./js/vue.min.js"></script>
  <script>
    // 3、配置对象
    let home = {
      template:"<div>主页界面</div>"
    }
    let list = {
      template:"<div>列表页面</div>"
    }
    // 1、注册全局组件
    Vue.component("v-home",home);
    Vue.component("v-list",list);
    // 2、创建vue实例
    let app = new Vue({
      el:"#app",
      data:{
        // isShow:true,
        dname:"v-list"
      },
      methods:{
        change(){
          this.dname = this.dname == "v-home"?"v-list":"v-home";
        }
      }
    })
  </script>
</body>
</html>

四、生命周期

4.1 什么是生命周期?

vue组件从创建,到更新,最后到消亡,这样的一个周期就是vue的生命周期。

生命周期钩子其实就是一些特殊的函数。

4.2 vue的生命周期可以分为三大阶段:

1、挂载(创建)阶段。 vue创建的时候就会执行

beforeCreate
create
beforeMount
mounted

2、更新阶段 。 当data中的数据发送了变化,才会执行

beforeUpdate
update

3、销毁阶段 。 vue销毁的时候就会执行

beforeDestroy
destroyed

五、组件通信

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <father></father>
  </div>
  <!-- 模板区域 -->
  <template id="father">
    <div>
      <p>我是父组件{{msg}}</p>
      <son :father-name="msg"></son>
    </div>
  </template>

  <template id="son">
    <div>
      <p>我是子组件{{fatherName}}</p>
    </div>
  </template>

  <script src="./js/vue.min.js"></script>
  <script>
    let son = {
      template: "#son",
      // 子组件要显式地用 props 选项声明它期待获得的数据
      props: ['fatherName']
    }
    let father = {
      template: "#father",
      data() {
        return {
          msg: "周润发"
        }
      },
      components: {
        son
      }
    }

    // 注册组件
    Vue.component("father", father);

    let app = new Vue({
      el: "#app"
    })
  </script>
</body>
</html>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值