【问题标题】:Reactjs findDOMNode on componentsReactjs findDOMNode 在组件上
【发布时间】:2015-08-04 19:33:51
【问题描述】:

我有一个使用另一个组件的组件

render: function(){
    return(
        <div className={"col-md-8 col-md-offset-2"}>
            <form onSubmit={this.handleSubmit}>
                <div className="panel panel-default">
                    <div className="panel-body">
                        <CustomerForm />
                    </div>
                </div>
                <button type="submit" className={"btn btn-default"} onClick={this.handleFormSubmit} value="Post">Submit</button>
            </form>
        </div>
    )
}

当我尝试显示数据时没有问题,但是, 当我想使用这个函数将数据发布到我的后端时,问题就来了

handleSubmit: function(e) {
        e.preventDefault();

        var firstName = React.findDOMNode(this.refs.firstName).value.trim();

        if (!firstName) {
            return;
        }

        this.props.onCustomerSubmit({firstName: firstName});
        React.findDOMNode(this.refs.firstName).value = '';

        return;
}

因为 findDOMNode 仅适用于已安装的组件并且是子组件,所以我收到错误 Uncaught TypeError: Cannot read property 'value' of null

有没有解决此类问题的好方法?

【问题讨论】:

    标签: post components reactjs


    【解决方案1】:

    深入了解您的refs 怎么样?

    在您的render() 函数中:

    <CustomerForm ref={'customerForm'} />
    

    在您的 handleSubmit() 函数中:

    React.findDOMNode(this.refs.customerForm.refs.firstName).value = '';
    

    但这在这个类和你的CustomForm 类之间增加了一些非常紧密的耦合。也许更好的方法是重构?

    【讨论】:

    • 谢谢!这就是我一直在寻找的答案。我会强烈接受你关于重构的建议,你对如何做有什么建议/建议吗?问题是表单会有几个部分,例如 。我认为一个好主意是将它们拆分为组件并将它们安装在
      组件中
    • 首先,如果该值由父组件“拥有”,您应该将该值作为属性传递,而不是抓取一个 DOM 节点并设置其值。如果子级内部处理的操作可以更改其值,那么它应该以state 拥有该值,而父级可选地提供initialValue
    • 如果您的组件代表表单,最好让它们渲染整个 form 元素... imo 拥有这个父表单是个坏主意。
    猜你喜欢
    • 2015-08-10
    • 2015-09-19
    • 1970-01-01
    • 2020-07-11
    • 2021-02-14
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多