• React 父子组件数据变化实时更新


    父组件数据变化,子组件数据更新方法:

    利用componentWillReceiveProps方法

    componentWillReceiveProps(nextProps){
      this.setState({
        isLogin: nextProps.isLogin,
        userInfo: nextProps.userInfo,
      });
       }
    

    子组件数据变化,通知父组件

      // 父组件:
      <FromCom demo={this.demo} />
      //子组件:利用setState的回调函数
      this.setState({}, () => {
          this.props.demo(userInfo);
        });
      
    

    实例

    在这里插入图片描述

    import "../static/css/login.scss";
    import React, { Component, useState, useEffect } from "react";
    import { Form, Input, InputNumber, Button, Tabs } from "antd";
    import { UserOutlined } from "@ant-design/icons";
    const { TabPane } = Tabs;
    
    export default class FormPage extends Component {
      constructor() {
        super();
        this.state = {
          isLogin: true,
          userInfo: {
            name: "",
            password: "",
          },
        };
      }
      callback = () => {
        this.setState({
          isLogin: !this.state.isLogin,
          userInfo: {
            name: "",
            password: "",
          },
        });
      };
      demo=(val)=>{
        console.log("=============>子组件传递的参数")
      }
      render() {
        const { isLogin, userInfo } = this.state;
        return (
          <div className="login">
            <Tabs defaultActiveKey="1" onChange={this.callback} size="large">
              <TabPane tab="登录" key="1"></TabPane>
              <TabPane tab="注册" key="2"></TabPane>
            </Tabs>
            <FromCom isLogin={isLogin} demo={this.demo} userInfo={userInfo} />
          </div>
        );
      }
    }
    class FromCom extends Component {
      constructor(props) {
        super(props);
        this.state = {
          ...props
        };
      }
    componentWillReceiveProps(nextProps){
      this.setState({
        isLogin: nextProps.isLogin,
        userInfo: nextProps.userInfo,
      });
       }
      submit = () => {
        const { userInfo, isLogin } = this.state;
        // 子组件改变传递给父组件采用setState的回调函数
        this.setState({}, () => {
          this.props.demo(userInfo);
        });
        if (isLogin) {
          console.log("=============>登录", userInfo);
        } else {
          console.log("=============>注册", userInfo);
        }
      };
      render() {
        const { userInfo, isLogin } = this.state;
        return (
          <div>
            <div>
              <Form
                name="basic"
                labelCol={{
                  span: 4,
                }}
                wrapperCol={{
                  span: 20,
                }}
                autoComplete="off"
              >
                <Form.Item label="用户名">
                  <Input
                    onChange={(e) => {
                      this.setState(() => (userInfo.name = e.target.value));
                    }}
                    value={userInfo.name}
                    size="large"
                    placeholder="请输入用户名"
                    prefix={<UserOutlined />}
                  />
                </Form.Item>
                <Form.Item label="密码">
                  <Input
                    onChange={(e) => {
                      this.setState(() => (userInfo.password = e.target.value));
                    }}
                    value={userInfo.password}
                    size="large"
                    placeholder="请输入密码"
                    prefix={<UserOutlined />}
                  />
                </Form.Item>
                <Form.Item>
                  <Button type="primary" onClick={this.submit}>
                    {isLogin ? "登录" : "注册"}
                  </Button>
                </Form.Item>
              </Form>
            </div>
          </div>
        );
      }
    }
    
    
    
  • 相关阅读:
    社交需求和社交产品的更替
    腾讯产培生面经
    【C++基础】类class
    【C++基础】结构struct
    【C++基础】C-串知识整理
    GeoServer war包在tomcat7中配置遇到的一个问题
    pgrouting 2.0 的环境配置
    阿里2014年9月笔试中的一个算法设计题--擦黑板剩余数字
    VisualSVN Server的启动关闭脚本
    二叉树遍历(前序、中序、后序)的递归及非递归实现(小结)
  • 原文地址:https://www.cnblogs.com/cupid10/p/15958064.html
Copyright © 2020-2023  润新知