07-Vue组件化

1.0 Vue组件的简单使用

  • 创建组件构造器对象:Vue.extend;创建完组件构造器时,通常使用template定义我自己的组件模板;这种定义模板的方式只限在Vue2.x里面使用
  • 注册组件:Vue.component;需要传递两个参数:1.注册组件的标签名 2.组件构造器
  • 使用组件:
<!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>
  <my-cpn></my-cpn>
</div>

<script src="../js/vue.js"></script>
<script>
  //1.创建组件构造器对象
  const cpnc = Vue.extend({
    template: `
        <div>
          <h2>我是中国人</h2>
          <p>中国的红色革命</p>
          <p>中国的快速崛起</p>
        </div>`
  });

  //2.注册组件
  Vue.component('my-cpn',cpnc);

  const app = new Vue ({
    el: '#app',
    data: {
      message: '中国人'
    }
  });
</script>
</body>
</html>

2.0 Vue的全局组件和局部组件

  • 局部组件直接在Vue实例中使用
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="app1" style="border: 1px cornflowerblue solid;">
  <!--3.使用组件-->
  <my-cpn></my-cpn>
  <my-cpn></my-cpn>
  <my-cpn></my-cpn>
</div>

<div id="app2" style="border: 1px crimson solid;">
  <!--3.使用组件-->
  <cpn></cpn>
</div>
<script src="../js/vue.js"></script>
<script>
  //1.创建组件构造器对象
  const cpnc = Vue.extend({
    template: `
        <div>
          <h2>我是中国人</h2>
          <p>中国的红色革命</p>
          <p>中国的快速崛起</p>
        </div>`
  });
  const cpne = Vue.extend({
    template: `
        <div>
          <h2>我是中国人</h2>
          <p>中国的红色革命</p>
          <p>中国的快速崛起</p>
        </div>`
  });

  //2.0.注册全局组件,在使用全局组件的时候不能单独使用,必须给Vue对象指定标签
  Vue.component('my-cpn',cpnc);
  const app1 = new Vue ({
    el: '#app1',
    data: {
      message: '中国人'
    }
  });

  //2.1.注册局部组件
  const app2 = new Vue ({
    el: '#app2',
    data: {
      message: '中国人'
    },
    components:{
      cpn: cpne
    }
  });
</script>
</body>
</html>

3.0 Vue父组件和子组件

  • 当父组件使用子组件的时候自己必须使用子组件
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="app">
  <cpnc2></cpnc2>
</div>

<script src="../js/vue.js"></script>
<script>
  const cpnc1 = Vue.extend({
    template: `
        <div>
          <h2>你是儿子</h2>
          <p>中国的红色革命</p>
          <p>中国的快速崛起</p>
        </div>`
  });

  const cpnc2 = Vue.extend({
    template: `
        <div>
          <h2>我是爸爸</h2>
          <p>中国的红色革命</p>
          <p>中国的快速崛起</p>
          <cpnc1></cpnc1>
        </div>`,
    components:{
      cpnc1: cpnc1
    }
  });

  const app = new Vue ({
    el: '#app',
    data: {
      message: '中国人'
    },
    components:{
      cpnc2: cpnc2
    }
  });
</script>
</body>
</html>

Vue组件语法糖

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

<script src="../js/vue.js"></script>
<script>
  //1.注册全局组件的语法糖
  Vue.component('my-cpn',{
    template: `
        <div>
          <h2>我是中国人</h2>
          <p>中国的红色革命</p>
          <p>中国的快速崛起</p>
        </div>`
  });

  //2.注册局部组件的语法糖
  const app = new Vue ({
    el: '#app',
    data: {
      message: '中国人'
    },
    components:{
      cpc:{
        template: `
        <div>
          <h2>我是中国人</h2>
          <p>中国的红色革命</p>
          <p>中国的快速崛起</p>
        </div>`
      }
    }
  });
</script>
</body>
</html>

Vue组件中的数据存放问题

<!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>

<template id="cpn">
  <div>
    <h2>{{message}}</h2>
    <p>我是内容,hehehe..</p>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>
  //1.注册全局组件的语法糖
  Vue.component('cpn',{
    template: '#cpn',
    message:'等你电话'
  });

  //2.注册局部组件的语法糖
  const app = new Vue ({
    el: '#app',
    data: {
      message: '中国人'
    }
  });
</script>
</body>
</html>

Vue为什么data必须返回的是函数

  • 每一个函数都会在data里面划分一块内存区域;这样做的好处是,当组件到多个地方使用的时候,数据不会因为一个动作改变了而产生其它地方数据改变了
  • 如果想以前Vue中定义属性,就会出现数据因为一个动作变了,其它地方也变了;这是因为一个属性只划分一个内存区域,大家都在一起使用它
<!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>

<template id="cpn">
  <div>
    <h2>当前计数:{{counter}}</h2>
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
  </div>
</template>

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

  //1.注册全局组件
  Vue.component('cpn',{
    template:'#cpn',
    data(){
      return{
        counter: 0
      }
    },
    methods:{
      increment(){
        this.counter++
      },
      decrement(){
        this.counter--
      }
    }
  })

  const app= new Vue ({
    el: '#app',
    data: {
      message: '你是猪吗???'
    }
  })
</script>
</body>
</html>

父子通信,父传子

  • 儿子想要用父亲的东西必须定义一样的函数去接
  • 关键函数properties(简写:props)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <!--数组写法-->
    <!--<cpn v-bind:cmessage="message" :cmovies="movies"></cpn>-->
    <cpn :cmessage="message" :cmovies="movies"></cpn>
</div>
<template id="cpn">
   <div>
       <p>{{cmovies}}}</p>
       <h2>{{cmessage}}</h2>
       <ul>
           <li v-for="item in cmovies">{{item}}</li>
       </ul>
   </div>
</template>

<script src="../js/vue.js"></script>
<script>
    const cpn={
        template:'#cpn',
        //数组写法
        //props:['cmovies','cmessage'],
        props:{
            cmessage:{
                type:String,
                default:'未提供数据!',
                required:true,
            },
            cmovies:{
                type:Array,
                default(){
                    return ['大海有风,我有你']
                }
            }
        },
        data(){
            return {}
        }
    }
    const app = new Vue({
        el:'#app',
        data:{
            message:"你好啊!老大",
            movies:['海尔兄弟','海贼王','海王']
        },
        components:{
            cpn
        }
    })
</script>
</body>
</html>

组件通信,子传父

  • 关键函数:$emit
  • 子组件发送一个点击事件,同时子组件要使用点击事件,用$emit把值传递给父组件;父组件监听到点击事件触发 ,执行父组件里面的点击事件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <cpn @itemclick="cpnClick"></cpn>
</div>

<template id="cpn">
    <div>
        <button v-for="item in categories"
                @click="btnClick(item)"
        >{{item.name}}</button>
    </div>
</template>

<script src="../js/vue.js"></script>
<script>
    const cpn={
        template:"#cpn",
        data(){
            return{
                categories:[
                    {id:'aaaa',name:'热门推荐'},
                    {id:'bbbb',name:'手机数码'},
                    {id:'cccc',name:'家用电器'},
                    {id:'dddd',name:'电脑办公'},
                ]
            }
        },
        methods:{
            btnClick(item){
                this.$emit('itemclick',item);
            }
        }
    }

    const app=new Vue({
        el:'#app',
        data:{

        },
        components:{
            cpn
        },
        methods:{
            cpnClick(item){
                console.log(item);
            }
        }
    });
</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值