【问题标题】:How to set className for selected child component in ReactJS如何在 ReactJS 中为选定的子组件设置 className
【发布时间】:2015-01-07 00:43:46
【问题描述】:

ReactJs 新手 - 我看过文档 herehere 但我有点困惑。

所以我有一个组件可以根据 JSON 数据创建多个表行。

我正在尝试这样做,因此一旦选择了单选按钮,父 <td> 的类将设置为“成功”。但目前该列的所有行都具有相同的类名。

var SearchResult = React.createClass({
    getInitialState: function () {
        return {
            site: '',
            address: '',
            data: [],
            checked: ''
        };
    },
    onSiteChanged: function (e) {
        this.setState({
            site: e.currentTarget.value,
            checked: 'success'
        });
    },
    render: function () {
        var resultRows = this.props.data.map(function (result) {
            return (
                <tr>
                    <td className={this.state.checked}>
                        <input type="radio" name="site_name"
                            value={result.SITE_NAME}
                            onChange={this.onSiteChanged}
                            key={result.id}/>{result.SITE_NAME}</td>
                    <td>
                        <input type="radio" name="address"
                            value={result.ADDRESS}
                            onChange={this.onAddressChanged} />{result.ADDRESS}</td>
                </tr>
            );
        }, this);
        return (
            <table className="table table-hover table-condensed">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Address</th>
                    </tr>
                </thead>
                <tbody>
                    {resultRows}
                </tbody>
                <tfoot>
                    <tr>
                        <td></td>
                        <td>{this.state.site}</td>
                        <td>{this.state.address}</td>
                    </tr>
                </tfoot>
            </table>
        );
    }
});

确保所选结果获得所选类名的最佳 ReactJS 方法是什么? 谢谢。

【问题讨论】:

  • 我认为代码有错误,key={resultRows.id}不应该是key={result.id}吗?
  • @ColinRamsay 很好,已解决问题。
  • 另外澄清一下,您是想在父 TD 还是父 TR 上设置 className?
  • 试图在选定的 上更改它。

标签: javascript reactjs


【解决方案1】:

要修改传递给 classSet 属性的值,React 有特殊的插件:React.addons.classSet。当您更改多个不同的类时它非常方便,但在您的情况下它也很有用:

var SearchResult = React.createClass({
    getInitialState: function () {
        return {
            site: '',
            address: '',
            checked: false,
            data: [],
        };
    },
    onSiteChanged: function (selected) {
        this.setState({
            site: selected.SITE_NAME,
            checked: selected.id,
        });
    },
    render: function () {
        var resultRows = this.props.data.map(function (result) {
            var cx = React.addons.classSet({
                success: (this.state.checked === result.id)
            });
            return (
                <tr key={result.id}>
                    <td className={cx}>
                        <input type="radio" name="site_name"
                            value={result.SITE_NAME}
                            onChange={this.onSiteChanged.bind(this, result)}
                            />{result.SITE_NAME}</td>
                    <td>
                        <input type="radio" name="address"
                            value={result.ADDRESS}
                            onChange={this.onAddressChanged} />{result.ADDRESS}</td>
                </tr>
            );
        }, this);
        return (
            <table className="table table-hover table-condensed">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Address</th>
                    </tr>
                </thead>
                <tbody>
                    {resultRows}
                </tbody>
                <tfoot>
                    <tr>
                        <td></td>
                        <td>{this.state.site}</td>
                        <td>{this.state.address}</td>
                    </tr>
                </tfoot>
            </table>
        );
    }
});

【讨论】:

  • 如果两个单选按钮恰好具有相同的值怎么办?在这种情况下,success: (this.state.site === result.SITE_NAME) 将为他们俩设置成功。从而只有选定的单选按钮才能获得成功类。这有点棘手。
  • 好吧,我错过了。在这种情况下,我们可以通过将 result.id 存储在 state 中来跟踪选择了哪一个。让我更新我的回复。我假设您的 id 在所有单选按钮中都是唯一的。
  • 我似乎无法让它工作,它似乎没有添加类名。这对你有用吗?
  • @Kash 我忘记更新 onSiteChanged 的​​代码以使其正常工作。我的答案现在更新了,请看一下。
  • 如果你删除关键属性 React 将在浏览器控制台中输出警告消息。当您开始更新其中一个元素内的内容时,可能会出现一些奇怪的问题。有关更多信息,请参阅 React 文档中的 Dynamic Children 部分。
猜你喜欢
  • 2021-02-05
  • 2020-12-01
  • 2021-10-23
  • 2021-09-25
  • 2018-04-29
  • 2018-10-21
  • 2016-05-10
  • 2015-06-08
相关资源
最近更新 更多