javascript - 在 React/TypeScript 中的循环内切换 CSS 类

标签 javascript reactjs typescript

想知道是否有人可以帮助我添加一个小功能到我正在构建的组件中。

我有一个 List 组件,它接收从 DocumentDB 传递的数据作为 prop。列表循环遍历它并生成一个漂亮的表格,其中包含数据和一些复选框、切换开关等。 /image/rBU6H.png

我希望能够使用我拥有的切换/开关组件(这基本上是一个花哨样式的复选框)来设置或删除每行上的事件类。我使用状态字段在每一行上设置一个类,确定它是事件还是非事件。

我遇到的问题是允许多个行同时处于事件状态 - 例如,第 1 行和第 2 行都处于关闭/非事件状态。如果我按下第 1 行上的开关来激活它,那么按下第 2 行上的开关也会将其标记为事件状态,而不是关闭第 2 行。我就是不知道如何连接它。

以下是一些传递的示例数据:

1: {
    id: "0729aba6-4d35", 
    firstName: "First", 
    lastName: "Last", 
    fullName: "First Last", 
    email: "first@last.com", 
    status: 1, //active
    …
}

This is a stripped down version of the component (删除了与我正在做的事情没有任何关系的绒毛):

import * as React from 'react';

interface IListProps {
    columns: Array<IColumns>;
    keyString: string,
    listItems: {
        [keyString: string]: any
    };
    selectable?: boolean;
}

export interface IColumns {
    attribute: string;
    displayName?: string | Object;
    sortable?: boolean;
    type: string;
}

interface IListItem {
    active?: boolean;
    selectable?: boolean;
    data: Object;
}

class List extends React.Component<IListProps, any> {

    public render() {

        const items = [];

            for (let key in this.props.listItems) {
                const item		= this.props.listItems[key];
                const listKey	= this.props.keyString;

                items.push(
                    <div key={item[listKey]} className={`row -${(item.status && item.status === 1) ? 'active': 'inactive'} -key-${item[listKey]}`}>
                    {
                        <div className={`col -column-checkbox`} key={index}>
                            <Checkbox id={`check-${item[listKey]}`} className="round" />
                        </div>
                        <div className={`col -column-toggle`} key={index}>
                            <Toggle value={`${item.status}`} activeState={item.status} id={`toggle-${item[listKey]}`} name={`toggle-${item[listKey]}`} />
                        </div>
                        <div className={`col -column-toggle`} key={index}>
                            <Avatar small userName={item.userName} />
                            <span className="label">
                                <strong>{item.fullName}</strong>
                            </span>
                        </div>
                    }
                );
            }
            return (
            <div className={'list'} id={'list'}>
                {items}
            </div>
        );
    }
}

export default List;

如果只是打开和关闭单行,我想我可以通过传递另一个 Prop 或其他东西来管理它,只是无法完全弄清楚如何独立更改循环内多行上的事件类。

最佳答案

到目前为止,在这段代码中我们可以看到:

<List>其中包含 listItems作为 Prop 。这意味着它是只读的。 然后用它来查找行的类。

您想要在单击 Toggle 时更改行的类成分。 这是表达您想要改变的另一种方式 listItems .

所以你需要一个方法作为 Prop 传递给 <Toggle>像这样:

<Toggle onToggle={this.toggle} />

然后是 <List> 中的方法像这样:

toggle = function (id) {
    return this.props.toggleStatus(id);
}

然后在保持状态 listItems 的更高组件中,您可以“真正”更改正确 ID 的状态。

这个想法是将变化从子级冒泡到父级。 child 只是提醒 parent 它已经改变了。然后父级成为其父级的子级并对其发出警报。等等,直到不再有 parent ,因为你已经处于状态所在的位置。这就是您更改它的地方。

关于javascript - 在 React/TypeScript 中的循环内切换 CSS 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45435103/

相关文章:

html - 如何向 NgZorro Collapse header 组件添加关闭按钮?

javascript - 在 React 中,对于一系列按钮,如何在单击后更改颜色,同时记录单击了哪个按钮?

javascript - 如何从数组中删除空对象?

reactjs - 通过 React useState() 处理表单数据的更好方法?

javascript - 在 MongoDB 中跟踪文档属性更改的最佳方法是什么?

node.js - react-scripts启动错误代码为134,未启动应用程序

interface - TypeScript 中的复杂接口(interface)

TypeScript:返回带有 "one option selected"的可区分联合

javascript - Chrome 更新阻止 Flash 自动播放 - 如何避免它?

javascript - angularjs fomly - 模板中的变量错误