在 React 渲染函数中使用 jQuery

Using jQuery inside of a React render function

我有以下 React 渲染函数:

   render: function () {
        return (
            <Popup onClose={this.props.onClose}>
                <Form entity="strategy" edit="/strategies/edit/" add="/strategies/add/">
                    <h2>Create/Edit Strategy</h2>
                    <StrategyForm pending={this.state.pending} formData={this.state.data} />
                    <div className="col-md-6">
                        <Assisting />
                    </div>
                </Form>
            </Popup>
        );
    }

我想让 h2 标题基于 body class,所以我的问题是...我可以这样做吗?

    render: function () {
        return (
            <Popup onClose={this.props.onClose}>
                <Form entity="strategy" edit="/strategies/edit/" add="/strategies/add/">
                    if ( $('body').hasClass("this") ) {
                     <h2>Create This Strategy</h2>
                    } else {
                     <h2>Create Another Strategy</h2>
                    }
                    <StrategyForm pending={this.state.pending} formData={this.state.data} />
                    <div className="col-md-6">
                        <Assisting />
                    </div>
                </Form>
            </Popup>
        );
    }

如果这是一个糟糕的想法,谁能告诉我在 React 中执行此操作的更好方法是什么?

正如在 OP 的一些评论中已经指出的那样,您 可以 做到这一点,但这并不是真正的 "React" 方式。

更好的解决方案可能是将 prop 传递到组件的使用中,或者在组件的状态上设置一个标志——然后使用该 prop/flag 进行渲染。

伪代码:

render() {
    return (
        if (this.props.someProp) {
            <h2>Create this Strategy</h2>
        } else {
            <h2>Create this Strategy</h2>
        }
    );
}

IMO 在组件方法中使用 jQuery 很好(例如 componentDidMount(),或其他 event/utility 方法),但通常您会希望在 render() 中避免这种情况. React 组件的全部目的是维护状态,因此像您的示例一样即时使用 jQuery 会打败这个想法。


例如,假设您以这种方式呈现您的组件:

ReactDOM.render(<MyComponent />, document.getElementById('some-div'));

您可以将属性传递给您的组件:

ReactDOM.render(
    <MyComponent someProp={true} />, 
    document.getElementById('some-div')
);

或者你的情况:

ReactDOM.render(
    <MyComponent someProp={$('body').hasClass("this")} />, 
    document.getElementById('some-div')
);

...类似的东西。这是一个过于简化的示例(未经测试,因此请注意语法错误),但这应该有助于解释我的思考过程。


或者,您可以在 class 上使用 componentDidMount() 方法。

componentDidMount() {
    this.setState({ 
        someProp : $('body').hasClass("this")
    });
}

然后在 render() 中检查 this.state.someProp.