假设在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属性进行声明、接收
日拱一卒无有尽,功不唐捐终入海