【问题标题】:React + Redux - Trigger select onChange() on initial loadReact + Redux - 在初始加载时触发选择 onChange()
【发布时间】:2018-03-01 18:34:58
【问题描述】:

我是 React 和 Redux 的新手,如果答案很琐碎,请原谅我,但经过广泛搜索后,我似乎找不到这个简单问题的好答案。我有多个级联选择,根据先前的选择填充数据。当用户更改所选选项时,一切正常。但是,我不知道在第一次选择中最初加载数据时如何触发 onChange 事件?这是简化的组件:

import React, {Component} from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { locationActions } from '../../_actions';
import { Input, Col, Label, FormGroup } from 'reactstrap';

class HeaderSetup extends React.Component {
  constructor(props) {
    debugger;
    super(props);        
    this.state = { location: 'Select an Option'};
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.loading !== this.props.loading &&
        nextProps.success !== this.props.success &&
        !nextProps.loading && nextprops.success) {
      this.setState({ location: '' });
    }
  }

  onLocationChanged(e) {
    console.log(e.target.value);    
  }

  render() {
    const { locations } = this.props;
    return (
      <FormGroup row>
        <Label for="locations" sm={3}>Locations</Label>
        <Col sm={8}>
        {locations.items &&                    
          <Input type="select" name="locations" id="locations" 
                onChange={this.onLocationChanged} 
                value={this.state.location}>
              {locations.items.map((location, index) =>
                  <option key={location.id}>
                      {location.locationName}                                
                  </option>
              )}
          </Input>
          }          
        </Col>
      </FormGroup>       
    )
  }
}

function mapStateToProps(state) {
  debugger;
  const { locations } = state;
  return {
    locations
  };
}

export default connect(mapStateToProps)(HeaderSetup); 

我只需要手动触发它吗?如果是这样,最好的地方/方法是什么?非常感谢任何帮助!

【问题讨论】:

  • 您的控制台日志有效吗?
  • @Omar - 当我更改选择选项时会发生这种情况。不在初始加载时。

标签: reactjs redux react-redux redux-form react-select


【解决方案1】:

由于您使用的是controlled components,它们应该始终反映状态。在您的 onChange 回调中,您应该只更新状态,所有输入都应该相应更新。

如果您提供一个显示此问题的最小工作示例,我可能能够提供更多详细信息。

下面是一个简单的设置示例:

class App extends React.Component {
  state = {
    locations: []
  };
  componentDidMount() {
    setTimeout(() => { // simulate loading
      this.setState({
        loading: false,
        locations: [
          {
            id: 1,
            label: "Paris"
          },
          {
            id: 2,
            label: "Rome"
          }
        ]
      });
    }, 3000);
  }
  render() {
    return <MyForm locations={this.state.locations} initialLocation={2}/>;
  }
}

class MyForm extends React.Component {
  state = {
    initialLocation: null,
    location: ""
  };

  componentWillReceiveProps(nextProps) {
    this.setState({
      initialLocation: nextProps.initialLocation,
    })
  }
  
  onChange = e => {
    this.setState({
      location: e.target.value
    });
  };

  render() {
    const { locations } = this.props;
    return (
      <label>
        <div>Select a location:</div>
        {locations.length > 0 && (
          <select value={this.state.location || this.state.initialLocation} onChange={this.onChange}>
            {locations.map(({ id, label }) => (
              <option key={id} value={id}>
                {label}
              </option>
            ))}
          </select>
        )}
      </label>
    );
  }
}

ReactDOM.render(<App />, document.body);
<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>

【讨论】:

  • 谢谢@thedude,但我已经尝试过了,当用户触发选择时它工作得很好。问题是最初填充第一个选择时它没有被触发。我需要默认触发第二个选择。我会给出一个工作示例,但它有点难以显示问题,因为它只是我遇到的初始加载问题。
  • @lentyai 我已经更新了示例以展示如何传递初始位置
猜你喜欢
  • 1970-01-01
  • 2021-02-17
  • 2017-09-28
  • 2019-06-06
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多