前言:

props属性的特点:(单向数据流) 业务中会经常遇到两种需要改变props的情况,一种是父组件传递初始值进来,子组件将它作为初始值保存起来,在自己的作用域下可以随意使用和修改。这种情况可以在组件data中再声明一个数据,引用父组件的prop。

$emit: $emit 触发当前实例上的事件,也可以简单的理解为触发父组件上的事件(向上冒泡)


在这里插入图片描述具体$emit参考官方文档:https://cn.vuejs.org/v2/api/#vm-emit


无参数型:

在这里插入图片描述案例:(一些解释请看注释)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div :style="{fontSize:fontSize+'px'}">{{pmsg}}</div>
        <!-- 注意要加单位px 不然不会生效 -->
        <menu-item :parr="parr" @enlarge-text="handle"></menu-item>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        // 子组件向父组件传值-基本用法
        //props传递数据原则:单向数据流

        Vue.component('menu-item', {
            props: ['parr'],
            template: `
        <div>
          <ul>
            <li :key='index' v-for='(item,index) in parr'>{{item}}</li>
          </ul>
          <button @click='parr.push("lemon")'>添加lemon水果(这种方法不推荐)</button>
          <!--直接子组件操作父组件传过来的数据 但是这种方法不推荐!!!-->
          <!-- props传递过来的数据是单向数据流 只允许父组件向子组件中传递数据 但是不允许直接操作props中的数据-->  
          <button @click="$emit('enlarge-text')">扩大父组件字体大小</button>
        </div>
      `
        });
        var vm = new Vue({
            el: '#app',
            data: {
                pmsg: '父组件中内容(初始size=10px 每次加5px)',
                parr: ['apple', 'orange', 'banana'],
                fontSize: 10
            },
            methods: {
                handle: function() {
                    // 扩大字体大小
                    this.fontSize += 5;
                }
            }
        });
    </script>
</body>

</html>

有参数型

在这里插入图片描述结果:
在这里插入图片描述

案例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <div :style='{fontSize: fontSize + "px"}'>{{pmsg}}</div>
    <menu-item :parr='parr' @enlarge-text='handle($event)'></menu-item>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    /*
      子组件向父组件传值-携带参数
    */
    
    Vue.component('menu-item', {
      props: ['parr'],
      template: `
        <div>
          <ul>
            <li :key='index' v-for='(item,index) in parr'>{{item}}</li>
          </ul>
          <button @click='$emit("enlarge-text", 5)'>扩大父组件中字体大小</button>
          <button @click='$emit("enlarge-text", 10)'>扩大父组件中字体大小</button>
        </div>
      `
    });
    var vm = new Vue({
      el: '#app',
      data: {
        pmsg: '父组件中内容',
        parr: ['apple','orange','banana'],
        fontSize: 10
      },
      methods: {
        handle: function(val){
          // 扩大字体大小
          this.fontSize += val;
        }
      }
    });
  </script>
</body>
</html>

Logo

前往低代码交流专区

更多推荐