vue初学-day09

110 阅读1分钟

14-(理解)为什么组件data必须是函数P58 - 00:05

针对全局组件

1、data属性必须是一个函数,有返回值

2、也有methods属性。

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

<!--2、通过template标签分离模板 -->
<template id="jsCpn1">
  <div>
    <p>我是通过template标签分离的模板 {{data1}}</p>
    <h2>计算结果{{counter}}</h2>
    <button @click="increment">+</button>
    <button>-</button>
  </div>
</template>
<!--使用vue-->

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

  // <!--注册全局组件-->
    Vue.component("cpn1",{
      template:"#jsCpn1",
      data(){//函数的形式
        return{
          data1:"使用data属性,组件中的数据存放必须是一个函数,有返回值",
          counter:0
        }
      },
      methods:{
        increment(){
          return this.counter++
        }
      }
    });
    //局部组件分离写法
    const app = new Vue({
      el:"#app",
      data:{
        message:"你好啊"
      },
      components:{"cpn2":{
          template:"#jsCpn2"
        }
      }
    })
</script>

15-(掌握)父子组件通信-父传子propsP59 - 00:10

1、父组件网络请求(通过 props向子组件传递数据)

通过事件向父组件发送消息

<div id="app">
<!--vue实例作为根组件,可向子组件传递数据-->
  <cpn1 :cmoves="moves" :cmessage="message"></cpn1>
</div>
<!--子组件模板 -->
<template id="childTemp">
  <div>
   <ul>
     <li v-for="item in cmoves">{{item}}</li>
   </ul>
    <h2>{{cmessage}}</h2>
  </div>
</template>
<!--使用vue-->
<script src="../js/vue.js"></script>
<script>
  const cpn1= {
      template:"#childTemp",
      // props:["cmoves","cmessage"],//1、数组形式传递

      // props:{//2、对象形式,类型限制
      //   cmoves:Array,
      //   cmessage:String,
      // },

      props:{//3、提供一些默认值和必传值
        cmoves:{
          type:Array,//类型是数组或者对象时 默认值必须是一个函数
          default(){
            return []
          },
          required:true
        },
        cmessage:{
          type:String,
          default:"默认值",
          required:true
        },
      },
    data(){
        return {}
    },
    methods:{}
  };
    const app = new Vue({
      el:"#app",
      data:{
        message:"你好啊",
        moves:["海贼王","美女与野兽","加勒比海盗","王者归来"]
      },
      components:{
        cpn1
        // "cpn1":{
        //   template:"#childTemp"
        // },

      }
    })
</script>

16-(掌握)父子组件通信-props驼峰标识P60 - 00:42

1、使用组件模板标签的驼峰式写法

2、组件模板中有多个标签的时候 必须有一个父级标签(包含根div)

<div id="app">
  <!--驼峰式写法-->
   <cpn1 :c-info="info" :my-message-info="message"></cpn1>
</div>
<template id="cpn-id">
  <div><!--//根部div-->
    <h2>{{cInfo}}</h2>
    <h2>{{myMessageInfo}}</h2>
  </div>
</template>
<!--使用vue-->
<script src="../js/vue.js"></script>
<script>
  const cpn1={
    template:"#cpn-id",
    props:{
      cInfo:{
        type:Object,
        default(){
          return {}
        }

      },
      //使用驼峰式
      myMessageInfo:{
        type:String,
        default:"默认值"
      }
    }
  };
    const app = new Vue({
      el:"#app",
      data:{
        message:"你好啊",
        info:{
          name:"zhangsan",
          old:"15岁",
          sex:"men"
        }
      },
      components:{
        cpn1
      }
    })
</script>



17-(掌握)父子组件通信-子传父(自定义事件)P61 - 00:11

注意子组件通过自定义事件 传递 $emit(“事件名称”,要传递的参数)

<div id="app">
  <!--v-on不仅可以监听dom事件,还可以监听组件间的自定义事件cpn-click=-->
    <cpn1 @cpn-click="cpnClick"></cpn1>
</div>
<!--子组件模板-->
<template id="temp-id">
 <div>
    <button v-for="(item,index) in categories" @click="btnClick(item)">{{item.title}}</button>
 </div>
</template>
<!--使用vue-->
<script src="../js/vue.js"></script>
<script>
// <!--子组件向父组件传递数据-->
    const cpn1={
      template:"#temp-id",
      data(){
        return {
          categories:[
            {id:"aa",title:"热门推荐"},
            {id:"bb",title:"家庭用品"},
            {id:"bb",title:"家庭用品"}
          ]
        }
      },
      methods:{
        btnClick(item){
            //组件标签使用的自定义事件 $emit("cpn-click名称",参数)
            this.$emit("cpn-click",item);
            console.log("btnClick")
        }
      }

    };
    //根组件
    const app = new Vue({
      el:"#app",
      data:{
        message:"你好啊",

      },
      components:{
        cpn1
      },
      methods:{
        //自定义的事件监听上绑定
        cpnClick(item){
          console.log("cpnClick",item)
        }
      }
    })
</script>