zoukankan      html  css  js  c++  java
  • react父子组件之间传值

    在单页面里面,父子组件传值是比较常见的,之前一直用vue开发,今天研究了一下react的父子组件传值,和vue差不多的思路,父组件向子组件传值,父通过初始state,子组件通过this.props进行接收就可以了;子组件向父组件传值需要绑定一个事件,然后事件是父组件传递过来的this.props.event来进行值的更替,话不多说,上代码:

    父组件向子组件传值:

    父组件Comment.js:

     1 import React from "react"
     2 import ComentList from "./ComentList"
     3  
     4 class Comment extends React.Component {
     5     constructor(props) {
     6         super(props);
     7         this.state = {
     8             arr: [{
     9                 "userName": "fangMing", "text": "123333", "result": true
    10             }, {
    11                 "userName": "zhangSan", "text": "345555", "result": false
    12             }, {
    13                 "userName": "liSi", "text": "567777", "result": true
    14             }, {
    15                 "userName": "wangWu", "text": "789999", "result": true
    16             },]
    17         }
    18     }
    19  
    20  
    21  
    22    
    23  
    24     render() {
    25         return (
    26             <div>
    27                 <ComentList arr={this.state.arr}> //这里把state里面的arr传递到子组件
    28                 </ComentList>
    29                
    30             </div>
    31  
    32         )
    33     }
    34 }
    35  
    36 export default Comment;

    子组件ComentList.js:

     1 import React from "react"
     2  
     3 class ComentList extends React.Component {
     4     constructor(props) {
     5         super(props);
     6  
     7     }
     8     render() {
     9         return (
    10             <div className="list">
    11                 <ul>
    12                     {
    13                         this.props.arr.map(item => { //这个地方通过this.props.arr接收到父组件传过来的arr,然后在{}里面进行js的循环
    14                             return (
    15                                 <li key={item.userName}>
    16                                     {item.userName} 评论是:{item.text}
    17                                 </li>
    18                             )
    19                         })
    20                     }
    21                 </ul>
    22              
    23             </div>
    24         )
    25     }
    26 }
    27  
    28 export default ComentList;
     

     父组件向子组件传值是比较容易的,我们来看一下效果:

    好了,我们开始重头戏,

    子组件向父组件传值,

    同样是父组件:

     1 import React from "react"
     2 import ComentList from "./ComentList"
     3  
     4 class Comment extends React.Component {
     5     constructor(props) {
     6         super(props);
     7         this.state = {
     8             parentText: "this is parent text",
     9    
    10             arr: [{
    11                 "userName": "fangMing", "text": "123333", "result": true
    12             }, {
    13                 "userName": "zhangSan", "text": "345555", "result": false
    14             }, {
    15                 "userName": "liSi", "text": "567777", "result": true
    16             }, {
    17                 "userName": "wangWu", "text": "789999", "result": true
    18             },]
    19         }
    20     }
    21  
    22     fn(data) {
    23         this.setState({
    24             parentText: data //把父组件中的parentText替换为子组件传递的值
    25         },() =>{
    26            console.log(this.state.parentText);//setState是异步操作,但是我们可以在它的回调函数里面进行操作
    27         });
    28  
    29     }
    30  
    31  
    32  
    33     render() {
    34         return (
    35             <div>
    36                 //通过绑定事件进行值的运算,这个地方一定要记得.bind(this),
    37             不然会报错,切记切记,因为通过事件传递的时候this的指向已经改变
    38                 <ComentList arr={this.state.arr} pfn={this.fn.bind(this)}>
    39                 </ComentList>
    40                 <p>
    41                     text is {this.state.parentText}
    42                 </p>
    43         
    44             </div>
    45  
    46         )
    47     }
    48 }
    49  
    50 export default Comment; 

    子组件:

     1 import React from "react"
     2  
     3 class ComentList extends React.Component {
     4     constructor(props) {
     5         super(props);
     6         this.state = ({
     7             childText: "this is child text"
     8         })
     9  
    10     }
    11     clickFun(text) {
    12         this.props.pfn(text)//这个地方把值传递给了props的事件当中
    13     }
    14     render() {
    15         return (
    16             <div className="list">
    17                 <ul>
    18                     {
    19                         this.props.arr.map(item => {
    20                             return (
    21                                 <li key={item.userName}>
    22                                     {item.userName} 评论是:{item.text}
    23                                 </li>
    24                             )
    25                         })
    26                     }
    27                 </ul>
    28                 //通过事件进行传值,如果想得到event,可以在参数最后加一个event,
    29                 这个地方还是要强调,thisthisthis
    30                 <button onClick={this.clickFun.bind(this, this.state.childText)}>
    31                     click me
    32                 </button>
    33             </div>
    34         )
    35     }
    36 }
    37  
    38 export default ComentList; 

    before:

    after:

     最后想说一点,如果嵌套的父子组件很深好几层,这个时候我想你应该考虑用状态管理工具redux了

  • 相关阅读:
    第三次作业
    第二次作业
    第一次作业
    仪仗队(欧拉函数)
    自己随便做的,没做完就没耐心继续了。呵呵
    从别处见到一位大神的代码 飞扬的小鸟(flappy bird)
    简易迷宫游戏c++
    STL做法 平衡树
    基于百度地图api + AngularJS 的入门地图
    javascript 简易文本编辑器
  • 原文地址:https://www.cnblogs.com/wangking/p/13899964.html
Copyright © 2011-2022 走看看