父子组件及兄弟组件传值demo

vue示例

此文档包含Vue,React和小程序示例

首先说一下三者在父子组件传值的异同点,语法上三者在父级向子级传递过程中都使用的是props,父级定义内容,子级进行接收。而在子级向父级进行传递过程中有些许不同:

  • 小程序:通过triggerEvent事件触发父级在子组件身上定义的事件,并且传值过程中要传递一个object对象,所有要传递的内容都写进对象里,父组件通过函数中的e.detail来进行定向接收。
  • vue:通过$emit来触发父级在子组件身上定义的事件,但可以在后面自定义多个要传递的参数,示例:
this.$emit("事件名","123","456")

接收:

事件名(value1,value2){
  console.log(value1,value2)
}
  • react:没有一个指定的方法来触发父级写在组件身上的事件,通过this.props.父级写在组件身上的事件即可,内容可传字符串也可以传递对象

Vue

父组件——index.vue

<template>
 <div class="hello">
 <div>
 <p>我是爸爸</p>
 </div>
 <div>
 大儿子告诉我:{{message}}
 </div>
 <test1 :toast="talkToTest1" @tell = "tellfather" @tellBrother = "telldidi">  </test1>
 <test2 :toast="talkToTest2" :brotherTell1="message2" :brotherTell2="message3"></test2>
 </div>
​
</template>
​
<script>
​
import test1 from "../common/test1";
​
import test2 from "../common/test2";
​
export default {
​
 name: "HelloWorld",
​
 data() {
​
 return {
​
 msg: "Welcome to Your Vue.js App",
​
 talkToTest1:"你是咱家老大",
​
 talkToTest2:"你是咱家老二",
​
 message:'',
​
 message2:'',
​
 message3:'',
​
 };
​
 },
​
 components: {
​
 test1,
​
 test2
​
 },
​
 methods:{
​
 tellfather(message){
​
 this.message = message
​
 },
​
 telldidi(message1,message2){
​
 this.message2 = message1
​
 this.message3 = message2
​
 }
​
 }
​
};
​
</script>

子组件1——test1

<template>
 <div>
 组件1 <br>
 爸爸跟我说的话,{{toast}}  <br>
 <button @click="tell">告诉爸爸</button>
 <button @click="tellBrother">告诉弟弟</button>
 </div>
</template>
<script>
export default {
 props:[
 'toast'
 ],
 data(){
 return{
 message:'好好照顾身体',
 message2:'好好学习',
 message3:'天天向上',
 }
 },
 methods:{
 tell(){
 this.$emit('tell',this.message)
 },
 tellBrother(){
 this.$emit("tellBrother",this.message2,this.message3)
 }
 }
}
</script>

子组件2——test2

<template>
 <div>
 组件2 <br>
 爸爸跟我说的话,{{toast}}  <br>
 哥哥跟我说的话:{{brotherTell1}}{{brotherTell2}}
 </div>
</template>
<script>
export default {
 props:[
 'toast','brotherTell1','brotherTell2'
 ],
 data(){
 return{
​
 }
 }
}
</script>

小程序

父级——index

index.wxml文件

<!--index.wxml-->
<view class="container">
 <test name="{{motto}}" bind:change="changeName" bind:add="addAge"></test>
 <text>我今年已经{{age}}岁了</text>
 <test2 name="{{aribo}}"></test2>
</view>

index.js文件

//index.js
//获取应用实例
const app = getApp()
​
Page({
 data: {
 motto: 'Hello World',
 age:1,
 aribo: 'Hello zhao'
 },

 onLoad: function () {

 },
 addAge:function(e){
 let num = 0;
 num = this.data.age + e.detail.num;
​
 this.setData({
 age: num
 })
 },
 changeName:function(e){
 this.setData({
 aribo:e.detail.name
 })
 }
​
})

index.json文件

{
 "usingComponents":{
 "test":"/components/test/test",
 "test2":"/components/test2/test2"
 }
}

子组件1

test.wxml文件

<!--components/test.wxml-->
<text>我是从父组件过来的---{{name}}</text>
<button bindtap='click'>加年龄</button>
<button bindtap='change'>改名字</button></pre>

test.js文件

// components/test.js
Component({
 /**
 * 组件的属性列表
 */
 properties: {
 name:{
 type:String,
 value:'111'
 }
 },
​
 /**
 * 组件的初始数据
 */
 data: {
​
 },
​
 /**
 * 组件的方法列表
 */
 methods: {
 click:function(data){
 let num = {
 num:1
 }
 this.triggerEvent('add',num)
 },
 change:function(){
 let data = {
 name:'Hello liu'
 }
 this.triggerEvent('change',data)
 }
 }
})

test.json

{
 "component": true,
 "usingComponents": {}
}

子组件2

test2.html

<!--components/test2/test2.wxml-->
<text>我是test2文件,我的名字是{{name}}</text>

test2.js

// components/test2/test2.js
Component({
 /**
 * 组件的属性列表
 */
 properties: {
 name:{
 type:String,
 value:''
 }
 },
​
 /**
 * 组件的初始数据
 */
 data: {
​
 },
​
 /**
 * 组件的方法列表
 */
 methods: {
​
 }
})

test2.json

{
 "component": true,
 "usingComponents": {}
}

react

父级——app.js文件

import React, { Component } from 'react';
import './App.css';
import Child1 from './components/child1'
import Child2 from './components/child2'
​
class App extends Component {
 constructor(){
 super();
​
 this.state = {
 talkTo1:'你是咱家老大',
 talkTo2:'你是咱家老二',
 childToMeMessage:'',
 tell:''
 }
 }
 childToMe(message){
 this.setState({
 childToMeMessage:message
 })
 }
 child2ToChild1(message){
 this.setState({
 tell:message
 })
 }
 render() {
 const talkTo1 = "你是咱家老大"
 const talkTo2 = "你是咱家老二"
 return (
 <div className="container">
 <div className="row">
 <div className="col-md-4">
 <h2>我是爸爸</h2>
 <p>大儿子跟我说:{this.state.childToMeMessage}</p>
 </div>
 <div className="col-md-4">
 <h2>我是大儿子</h2>
 <Child1 tell={this.state.tell} talk={this.state.talkTo1} toFather={this.childToMe.bind(this)}></Child1>
 </div>
 <div className="col-md-4">
 <h2>我是小儿子</h2>
 <Child2 talk={this.state.talkTo2} toBrother={this.child2ToChild1.bind(this)}></Child2>
 </div>
 </div>
 </div>
 );
 }
}
​
export default App;

子组件1——child1.js

import React , {Component} from 'react';
import PropTypes from 'prop-types';
​
export default class Child1 extends Component{
 constructor(props){
 super(props);
​
 this.state ={
 talkToFather:'好好照顾身体'
 }
 }
 talkToFather(){
 this.props.toFather(this.state.talkToFather)
 }
 render() {
 return (
 <div className="container">
 <p>爸爸告诉我:{this.props.talk}</p>
 <button className="btn btn-default" onClick={this.talkToFather.bind(this)}>我要跟爸爸说</button>
 <p>弟弟告诉我:{this.props.tell}</p>
 </div>
 );
 }
}
Child1.PropTypes = {
 talk:PropTypes.string
}

子组件2——child2.js

import React , {Component} from 'react';
import PropTypes from 'prop-types';
​
export default class Child2 extends Component{
 constructor(props){
 super(props);
​
 this.state ={
 talkToBrother:'要好好学习啊'
 }
 }
 talkToBrother(){
 this.props.toBrother(this.state.talkToBrother)
 }
​
 render() {
 return (
 <div className="container">
 <p>爸爸告诉我:{this.props.talk}</p>
 <button onClick={this.talkToBrother.bind(this)} className="btn btn-info">我要跟哥哥说</button>
 </div>
 );
 }
}
Child2.PropTypes = {
 talk:PropTypes.string
}

文章涉及的Vue文件内容使用vue-cli脚手架搭建,React内容使用Create-app-react搭建,小程序使用原生

代码详细内容参见github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容