【问题标题】:Invoke `componentDidUpdate` on form submit在表单提交时调用 `componentDidUpdate`
【发布时间】:2018-05-25 23:12:17
【问题描述】:

我有一个类组件如下:

class App extends Component {
    constructor(props){
        super(props);
        this.state = {
            abc: '',
            someQuery: ''
        }
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChange = this.handleChange.bind(this);
    }

    componentDidUpdate(){
        fetch(`/someLink/${this.state.abc}`)
        .then(response => {
            return response.json();
        }).then(data => {
            this.setState({
                someQuery: data.xxx
            });
        });
    }
    handleSubmit(e){
        const target = e.target;
        const value = target.value;

        this.setState({
            abc: value
        })
        e.preventDefault();
    };
    handleChange(e){
        const target = e.target;
        const value = target.value;

        this.setState({
            abc: value
        });
    };
    render(){
        return(
            <form onSubmit={this.handleSubmit}>
                <input name='abc' value={this.state.abc} onChange={this.handleChange} />
                <input type="submit" value="Submit" />
            </form>

            <div>{this.state.abc} is currently accessing data from {this.state.someQuery}</div>
        )
    }
}

如何在每次更新输入字段的值并单击提交按钮时运行componentDidUpdate()

上面调用了生命周期,但是由于setState也在handleChange()中,生命周期在我输入内容的那一刻被调用,而不是等到提交按钮被点击。

handleChange() 中删除setState 会使输入字段值不再可编辑(无法在输入字段上键入)。

我需要在生命周期中将输入字段值附加到api link,但我似乎无法找出正确的方法。

【问题讨论】:

  • 在您的输入中使用 defaultValue 而不是 value。
  • 为什么不在componentDidMount 中添加条件来查看表单是否已提交?

标签: javascript reactjs react-lifecycle


【解决方案1】:

您可以在组件类中添加任何方法并在提交时调用它。 componentDidUpdate 不是做这种事情的正确地方,尤其是设置状态是犯罪:D

class App extends Component {
    constructor(props){
        super(props);
        this.state = {
            abc: '',
            someQuery: ''
        }
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChange = this.handleChange.bind(this);
    }

    doSommething (value){
        fetch(`/someLink/${value}`)
        .then(response => {
            return response.json();
        }).then(data => {
            this.setState({
                someQuery: data.xxx
            });
        });
    }
    handleSubmit(e){
        const target = e.target;
        const value = target.value;

        this.setState({
            abc: value
        })
        e.preventDefault();
        doSommething(value);
    };
    handleChange(e){
        const target = e.target;
        const value = target.value;

        this.setState({
            abc: value
        });
    };
    render(){
        return(
            <form onSubmit={this.handleSubmit}>
                <input name='abc' value={this.state.abc} onChange={this.handleChange} />
                <input type="submit" value="Submit" />
            </form>

            <div>{this.state.abc} is currently accessing data from {this.state.someQuery}</div>
        )
    }
}

【讨论】:

  • 我在某处读到应该在 `componentDidUpdate' 生命周期内调用 api 获取,因此我采用上述原始方法。感谢 Zohaib 的帮助。
  • @AndrewL 不,它是componentDidMount 而不是componentDidUpdate。它适用于您希望从 api 获取数据的情况,这些数据将很快呈现,但不是那种会在某些点击或某些事件时经常获取的 api 调用。使用简单的方法来做到这一点,就像你的代码onSubmit
  • 所以对于一个不能立即渲染数据的API,我应该使用componentDidMount?
  • @AndrewL 不,抱歉我选错了词。让我解释。例如如果您想显示用户列表并且数据将来自 api,您需要通过调用实际上将从 api 获取数据的可重用方法来获取 componentDidMount 中的数据。并且您可以稍后在某些事件(例如删除用户)上调用该可重用方法,这将更新用户列表数据
  • 哦,好的。感谢Zohaib的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多