函数在vue组件间的交互

假设在App.vue组件中定义一个addComment函数,而在Add.vue组件中会去调用这个addComment函数

App.vue

<template>
  <div>
    <header class="site-header jumbotron">
      <div class="container">
        <div class="row">
          <div class="col-xs-12">
            <h1>请发表对Vue的评论</h1>
          </div>
        </div>
      </div>
    </header>
    <div class="container">


    </div>

    <!--将addComment方法传到Add组件-->
    <Add :addComment="addComment"/>
    <!--通过下面这种方式就是comments内容传递到了List组件中,记得冒号,如果没有冒号,传递的就是comments这个文本内容-->
    <List :comments="comments"/>

  </div>
</template>


<script>
  import Add from './components/Add.vue'
  import List from './components/List.vue'
  export default{
//    在App组件中初始化数据,而数据展示是在List组件中,这就涉及到了组件间的通信
    data(){  // 数据在哪个组件,其相关的行为就应该在那个组件
      return {
        comments: [{
          name: 'Bob',
          content: 'Vue 还不错'
        }, {
          name: 'Cat',
          content: 'Vue so Easy'
        }, {
          name: 'BZ',
          content: 'Vue so so'
        }
        ]
      }
    },
    methods: {
      // 添加评论
      // 定义一个函数
      addComment (comment){
        this.comments.unshift(comment)
      }
    },
    components: {
      Add, List
    }

  }
</script>


<style>

</style>

Add.vue

<template>
  <div class="col-md-4">
    <form class="form-horizontal">
      <div class="form-group">
        <label>用户名</label>
        <input type="text" class="form-control" placeholder="用户名" v-model="name">
      </div>
      <div class="form-group">
        <label>评论内容</label>
        <textarea class="form-control" rows="6" placeholder="评论内容" v-model="content"></textarea>
      </div>
      <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
          <button type="button" class="btn btn-default pull-right" @click="add">提交</button>
        </div>
      </div>
    </form>
  </div>
</template>


<script>
  export default{
    data(){
      return {
        name: '',
        content: ''
      }
    },
    methods: {
      add(){
        //1. 可以检测输入的合法性
        const name = this.name.trim();
        const content = this.content.trim();
        if (!name || !content) {
          alert('姓名或者内容不能为空!');
          return
        }
        //2.根据输入的数据,封装成一个comment对象
        const comment = {
          name, content
        }
        //3.添加到comments中
        this.addComment(comment)
        //4.清除数据
        this.name = '';
        this.content = '';
      }
    }
    ,
    props:{
      addComment: {// 指定了属性名,属性值的类型,和必要性
        type:Function,
        required: true
      }
    }
  }
</script>


<style>

</style>

函数同数据一样,都是在定义函数的组件中通过冒号名称进行传递,然后在调用方使用props属性进行声明、接收

原文地址:https://www.cnblogs.com/z-qinfeng/p/12383813.html