当前位置: 首页 > 知识库问答 >
问题:

反应访问子状态

子车修平
2023-03-14

我有一个名为AvailabiltyCalender的组件,还有一个子组件名为DatePicker。智利组件有一个名为focusedInput的状态。我需要从AvailabiltyCalendar组件访问该状态并获取该状态值。我该怎么做呢。

可用压路机组件

import React, { Component } from 'react';
import './AvailabilityCalender.css';
import backArrow from '../../../assets/images/back.png';

import DatePicker from '../../Common/DatePicker/DatePicker';

import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import PropTypes from "prop-types";

import moment from 'moment';

class AvailabiltyCalender extends Component {
    componentWillReceiveProps(nextProps) {
    }

    render() {

        const { checkInOutDates: { checkInDate, checkOutDate } } = this.props;

        let checkIn = checkInDate.format('ddd DD MMM');
        let checkOut = checkOutDate.format('ddd DD MMM');

        return (
            <div className="full_width checkin_checkout_wr">
                <DatePicker />
            </div>
        );
    }
}

AvailabiltyCalender.propTypes = {
    checkInOutDates: PropTypes.object.isRequired
};

function mapStateToProps(state, ownProps) {

    const dates = state.searchPageReducer.checkInOutDates;

    const checkDates = {
        checkInDate: moment(dates.checkInDate),
        checkOutDate: moment(dates.checkOutDate)
    }

    return {
        checkInOutDates: checkDates,
    };
}

export default connect(mapStateToProps)(AvailabiltyCalender);

DatePicker组件

import React, {Component} from 'react';
import 'react-dates/initialize';
import {DateRangePicker, SingleDatePicker, DayPickerRangeController} from 'react-dates';
import 'react-dates/lib/css/_datepicker.css';
import './DatePicker.css';
import moment from "moment";

import {connect} from "react-redux";
import PropTypes from "prop-types";
import {bindActionCreators} from "redux";
import * as searchPageActions from "../../../pages/Search/searchPageActions";



class DatePicker extends Component
{
    constructor(props)
    {
        super(props);

    let check_in = moment(this.props.checkInOutDates.checkInDate);
    let check_out = moment(this.props.checkInOutDates.checkOutDate);

    this.state = {
        startDate: check_in,
        endDate: check_out,
    };

    this.onDatesChange = this.onDatesChange.bind(this);
}

onDatesChange({ startDate, endDate }) {
    this.setState({ startDate, endDate });
    this.props.actions.retrieveCalendarResults({
        checkInDate: startDate,
        checkOutDate: endDate,
    });


        // if(this.state.focusedInput === 'endDate'){

        // }


}

render()
{
    const { focusedInput } = this.state;

    const { checkInOutDates: { checkInDate, checkOutDate} } = this.props

    return (
        <div className="DateRangePickerInput DateRangePickerIcon">
            <DateRangePicker
                    startDate={checkInDate} 
                    startDateId="checkin_date_id" 
                    endDate={checkOutDate}
                    endDateId="checkout_date_id"
                    onDatesChange={({ startDate, endDate }) => this.onDatesChange({ startDate, endDate }) }
                    focusedInput={this.state.focusedInput}
                    onFocusChange={focusedInput => this.setState({focusedInput}) }
                    orientation="vertical" withFullScreenPortal
                    startDatePlaceholderText="Checkin"
                    endDatePlaceholderText="Checkout"

            />
        </div>
    );

}
}

DatePicker.propTypes = {
    checkInOutDates: PropTypes.object.isRequired
};


function mapStateToProps(state, ownProps)
{
    const dates = state.searchPageReducer.checkInOutDates;

    const checkDates = {
        checkInDate: moment(dates.checkInDate),
        checkOutDate: moment(dates.checkOutDate)
    }

    return {
        checkInOutDates: checkDates
    };
}

function mapDispatchToProps(dispatch)
{
    return {
        actions: bindActionCreators(searchPageActions, dispatch)
    };
}

export default connect(mapStateToProps, mapDispatchToProps)(DatePicker);

共有2个答案

慕永年
2023-03-14

简单回答:你没有。

在React中,状态仅单向流动。从父组件到状态。因此,如果您想访问子组件中的某些内容,则必须将状态保留在父组件中,并将其作为道具传递给子组件。

如果子组件需要更改传递给它的Prop,它可以从父组件调用要作为prop传递的函数。

您可以在这里阅读有关模式的信息。

class Child extends React.Component {
  constructor(props) {
    super(props);
  }
  componentWillReceiveProps(nextProps) {
    //Perform any computations you want to perform with new prop here
  }
  render() {
    const {value, toggle} = this.props;
    return (
      <div class="child">
        <span>Child: {value.toString()} </span>
        <button onClick={toggle}>Toggle in Child</button>
      </div>
    );
  }
}

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: true
    };
    this.toggle = this.toggle.bind(this);
  }
  toggle() {
    this.setState((prevState)=>{
      return {
        value: !prevState.value
      }
    });
  }
  render() {
    return (
      <div>
        <Child value={this.state.value} toggle={this.toggle} />
        <button onClick={this.toggle}>Toggle</button>
      </div>
    );
  }
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
张玺
2023-03-14

正如这里提到的:https://stackoverflow.com/a/46633043/8489245 ? 您可以通过在子对象中触发的事件获取子对象状态,并通过回调在父对象中侦听它!

希望它能帮助你!

 类似资料:
  • 我试图理解下面的反应HOC; 下面是另一个组件; 具体来说我是想了解 如果它“DisplayTheCret”访问道具“secretToLife”或WrappedComponent?正确看待这一问题的方法是什么? “const WrappedComponent=withSecretToLife(displaytescret);”行位于“const displaytescret=props”行之后=

  • 问题内容: 我有以下结构: -包含多个FieldEditor- 编辑表单的字段并在其状态下保存有关该字段的各种值 在FormEditor中单击按钮时,我希望能够从所有组件中收集有关字段的信息,处于其状态的信息,并将其全部包含在FormEditor中。 我考虑过将有关字段信息的信息存储在的状态之外,而是将其置于的状态。但是,这将需要在组件的每个组件发生更改时侦听它们并以其状态存储其信息。 我不能只访

  • 我有以下结构: -保存FieldEditor的多个实例-编辑表单的字段,并在其状态下保存有关该字段的各种值 当单击FormEditor中的按钮时,我希望能够从所有组件中收集有关字段的信息,处于其状态的信息,并将其全部包含在FormEditor中。 我考虑将有关字段的信息存储在的状态之外,并将其置于的状态。但是,这将需要在其组件更改并将其信息存储在其状态时侦听它们。 我不能直接进入儿童状态吗?理想吗

  • 我对状态同步有问题。当我点击编辑器的外部(想要关闭它),我想把实际的文本传回给父节点(函数)。但是当我在之外单击时,状态似乎总是落后一步。(例如:如果编辑器内部有,我键入,,我键入,等等)。 如果我在编辑器外单击,将出现的实际状态,如何实现这一点?

  • 我想访问父组件中的子组件的状态,我不想在子组件中使用任何可以在父组件中设置变量的处理程序,或者我不想在父组件中提升状态。我怎么能使用ref的反应打字稿创建Ref并获得父组件中的孩子的状态? 家长: 儿童: