Vue组件以及传值

组件化

简介:

组件(component)是vue.js最强大的功能之一。组件的作用就是封装可重用的代码,通常一个组件就是一个功能体,便于在多个地方都能够调用这个功能体。
每个组件都是Vue的实例对象。
我们实例化的Vue对象就是一个组件,而且是所有组件的根组件

全局注册组件和局部注册组件

全局注意点:

  1. 组件中的data是一个函数,不是对象
  2. 组件中必须有一个唯一的根元素
  3. 模板中内容较多时候建议使用模板字符串

局部注意点:

  1. 局部注册的子组件只能在注册过的父组件中使用
  2. components是注册组件的意思

折叠面板案例

<body>
    <div id="app">
      <my-collapse></my-collapse>
      <my-collapse></my-collapse>
      <my-collapse></my-collapse>
    </div>
    <!-- 定义折叠面板模板 -->
    <template id="my-collapse">
      <div>
        <button @click="isShow=!isShow">折叠</button>
        <div v-show="isShow">我是折叠显示的内容</div>
      </div>
    </template>
  </body>

  <script>
    let myHeader = {
      data: function() {
        return {
          isShow: false
        };
      },
      template: "#my-collapse",
      methods: {}
    };

    var vue = new Vue({
      el: "#app",
      data: {},
      methods: {},
      computed: {},
      components: {
        "my-collapse": myHeader
      }
    });
  </script>

组件传值

父传子

执行步骤如下:

1、父组件定义数据
2、父组件通过属性的方式给子组件传递数据
3、子组件通过props属性接受数据并做参数设置
4、子组件使用传递过来的数据

props细节

  1. 每一个数据项,都可以有3个属性进行约束type,类型约束,约束父组件给子组件传递的数据类型,类型可以是:Object、Array、Number、String、Boolean等几种。
  2. default,指定默认值,如果父组件没有传递数据,可以指定默认值
  3. required,指定该数据项是否必须传递
父组件给子组件传递数组,子组件循环遍历使用

 <body>
    <div id="app">
      <!-- <my-son :num="number"></my-son> -->
      <my-son :list="students"></my-son>
    </div>
    <!-- 定义折叠面板模板 -->
    <template id="my-son">
      <div>
        <ul>
          <li v-for="(item,index) in list">
            <h3>{{ item.name }}</h3>
            <p>{{ item.age }}</p>
          </li>
        </ul>
      </div>
    </template>
  </body>

  <script>
    let mySon = {
      data: function() {
        return {};
      },
      props: {
        list: {
          type: Array
        }
      },
      template: "#my-son",
      methods: {}
    };

    var vue = new Vue({
      el: "#app",
      data: {
        students: [
          { id: 1, name: "tom", age: 21 },
          { id: 2, name: "jim", age: 22 },
          { id: 3, name: "jack", age: 23 }
        ]
      },
      methods: {},
      components: {
        "my-son": mySon
      }
    });
  </script>

子传父

执行步骤如下:

1、子组件绑定事件

<button @click='childClick'>点击</button>

调用this.$emit方法传递数据,第一个参数是自己定义的事件名,第二个参数是传递的数据

2、父组件监听传递的事件childhandle

3、父组件中对监听的事件做处理,拿到传递的数值再在页面显示或其他处理。

兄弟组件传值

说明:兄弟组件之间没办法直接进行传值,可以通过一个中转站进行数据传递

执行步骤如下:

1、两个子组件定义并在父组件注册

2、两个子组件分别定义各自的事件,注意调用的时候互相调用

3、父组件中定义事件销毁的方法

留言板案例

<body>
    <div id="app">
      <h3>请输入你的个人见解</h3>
      <msg-list :msg="msglist"></msg-list>
      <add-msg @postmsg="receive"></add-msg>
    </div>

    <!-- 1、定义添加组件模板 -->
    <template id="add-msg">
      <div>
        <input type="text" v-model="title" />
        <textarea v-model="content" cols="30" rows="10"></textarea>
        <button @click="postMsg">点击</button>
      </div>
    </template>

    <!-- 2、定义组件列表模板 -->
    <template id="msg-list">
      <div>
        <h3>留言区内容</h3>
        <ul>
          <li v-for="(item,index) in msg">
            <p>第几楼</p>
            <p>{{ item.title }}</p>
            <p>{{ item.content }}</p>
          </li>
        </ul>
      </div>
    </template>
  </body>

  <script>
    //   3、定义添加组件对象
    let addMsg = {
      data: function() {
        return {
          title: "",
          content: ""
        };
      },
      template: "#add-msg",
      methods: {
        postMsg: function() {
          //   this.title是获取用户输入的标题  this.content是获取用户输入的内容
          this.$emit("postmsg", { title: this.title, content: this.content });
        }
      }
    };
    //   4、定义组件列表对象
    let msgList = {
      data: function() {
        return {};
      },
      props: {
        msg: {
          type: Array
        }
      },
      template: "#msg-list"
    };
    //   根组件
    var vue = new Vue({
      el: "#app",
      data: {
        msglist: []
      },
      methods: {
        receive: function(msg) {
          this.msglist.push(msg); //val是获取到的子组件传递过来的单条对象信息
        }
      },
      //   3、注册子组件
      components: {
        "add-msg": addMsg,
        "msg-list": msgList
      }
    });
  </script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值