美文网首页
react父子通讯

react父子通讯

作者: 樊小勇 | 来源:发表于2019-04-22 19:28 被阅读0次
    • 父子通讯
      父传数据给子,子传数据给父
    • react组件
      class 组件名 extends React.Component
    • react组件区别
      1.容器组件
      容器组件也就是我们所谓的父组件,作用是储存数据,分发数据
      2.视图组件
      而视图组件就是我们所谓的子组件,作用是显示数据


      组件之间的关系

      其中DefaulPage对应的就是容器组件(父组件)
      而其他的都是视图组件(子组件)

    • 容器组件(父组件)
    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    import { bindActionCreators } from 'redux';
    import { connect } from 'react-redux';
    import * as actions from './redux/actions';
    import Header from './Header';
    import List from './List';
    import Swiper from './Swiper';
    import Footer from '../common/Footer';
    import $http from '../../utils/request';
    // 在个common是小写的,common是公共部分
    
    export class DefaultPage extends Component {
      constructor(props){
        super();
        this.state={
          // 这里的state相当于date
          flowlist:[]
        }
      }
      static propTypes = {
        index: PropTypes.object.isRequired,
        actions: PropTypes.object.isRequired,
      };
      // 挂载函数,页面创建后立马运行的函数
      componentDidMount(){
        this.getlist();
      }
      // 获取后台数据,并给flowlist
      async getlist(){
        let url = '/flower/getList';
        let res = await $http.get(url);
        this.setState({
          flowlist:res.flowers
        })
      }
    
      render() {
    // 传数据给子组件
        let token = localStorage.getItem('token');
        console.log(token);
        let {flowlist} = this.state;
        return (
          <div className="index-default-page">
            <Header {...this.props}/>
            <Swiper/>
            <List flowlist={flowlist}/>
            <Footer pageName="index"/>
          </div>
        );
      }
    }
    
    /* 把所有的state添加到props*/
    function mapStateToProps(state) {
      return {
        index: state.index,
      };
    }
    
    /* 把所有的action添加到props */
    function mapDispatchToProps(dispatch) {
      return {
        actions: bindActionCreators({ ...actions }, dispatch)
      };
    }
    
    export default connect(
      mapStateToProps,
      mapDispatchToProps
    )(DefaultPage);
    

    容器组件里引用子组件,通过添加属性传数据到子组件,也可以直接把父组件的props全部传过去{...props}
    而子组件则负责把这些数据显示出来

    • 子组件(视图组件)
    import React, { Component } from 'react';
    import { Link } from 'react-router-dom';
    
    export default class List extends Component {
      constructor(props){
        super();
      }
      static propTypes = {
      };
      render() {
        let flowlist = this.props.flowlist;
       // 获取父组件传来的数据并进行渲染页面
        return (
          flowlist.map(item=>{
            return (
              <div className="index-list list" key={item.flowerId}>
            <Link to={`/detail/${item.flowerId}`} className="mt-10">
            <a to="/flower/detail" className="flex item">
              <p className="img-box">
                <img
                  className="w100pc"
                  src={item.imgUrl}
                  alt=""
                />
              </p>
              <div className="text bg-fff fg1 flex2 jc-sb">
                <div className="h88 bdb flex2 jc-c">
                  <p className="f14">{item.name}</p>
                  <p className="f12 lh15 mt-5">
                    {item.material}
                  </p>
                </div>
                <p className="h38 bdb flex aic">
                  暖春新品
                </p>
                <div className="h68 flex2 jc-c rel">
                  <p>
                    <span className="orange">¥{item.price}</span>
                    <s className="ml-10">¥{item.originPrice}</s>
                  </p>
                  <p className="mt-5">已售 {item.saleNum}件</p>
                  <i className="iconfont icon-gouwuche abs"></i>
                </div>
              </div>
            </a>
          </Link>
          </div>
            )
          })
        );
      }
    }
    

    视图组件(子组件则负责用数据渲染页面)

    • 父传子
    父传子说白了无非就是父通过属性传数据给子组件下面列出方式
            <zi   name={name}/>        传名为name的变量
            <zi    {...this.props}/>         把props传给子组件的props
            <zi     change={this.change}>      传一个函数给
    
    • 子传父
    子传父,说白了就是子调用父传过来的函数,并把参数带过去
        上述里有一个父传给子一个函数,而这就是子传父的重点
       子通过this.props.change,得到父传来的函数
        我们可以触发这个函数并把参数带过去
         这个时候我们需要用到     ()=>
        onClike={()=>{change(数据)}}       通过点击调用函数传参
        这里调用参数可以使用其他事件,但是立马必须是()=>
        表示点击里面的函数就被直接调用(触发)
    

    相关文章

      网友评论

          本文标题:react父子通讯

          本文链接:https://www.haomeiwen.com/subject/gybugqtx.html