javascript - React.js 映射如何改变单个元素

标签 javascript reactjs

这是代码,所以我有一个呈现间隔列的组件,我想通过单击和拖动更改表格的颜色,但发生的事情是它改变了一切......我是一个完全的初学者, 所以我真的不知道我该怎么做..

import React, { Component } from 'react';

class TableBody extends Component {
constructor(props) {
super(props);

this.state = {
  intervalItems: this.props.intervalItems,
  flag: 0,
  bgColor: '',
};
}

_mouseDown() {
this.setState(prevState => ({
  flag: 1,
}));
}

_mouseUp() {
this.setState(prevState => ({
  flag: 0,
}));
}

_mouseDrag(iD) {
if (this.state.flag == 1) {
  this.setState(prevState => ({
    bgColor: 'green',
  }));
} else {
  this.setState(prevState => ({
    bgColor: '',
  }));
}
}

render() {
const { dayItems, intervalItems } = this.props;

return (
  <tbody>
    {dayItems.map(v => (
      <tr key={v.id}>
        <th>
          <div>{v.day}</div>
        </th>

        {this.state.intervalItems.map((v, i) => (
          <td
            key={v.id}
            onMouseDown={() => this._mouseDown()}
            onMouseMove={() => this._mouseDrag()}
            onMouseUp={() => this._mouseUp()}
            className={`table-inside-default ${this.state.bgColor}`}
          >
            {v.interval}
          </td>
        ))}
      </tr>
    ))}
  </tbody>
);
}
}

导出默认的TableBody;

最佳答案

看起来正在发生的事情是您正在更新所有 <td> 的颜色标签一次。发生这种情况是因为它们都引用同一个状态,this.state.bgColor .当一个td被更改,组件被重新渲染并且所有元素指向 this.state.bgColor将显示为相同的颜色。

您可能会考虑向您的州添加另一个属性,例如 this.state.activeItem ,并从您的 _mouseDrag 更新它功能。根据您的activeItem ,然后您可以设置指定的颜色,以便仅更新该颜色。您可能想要重置 activeItem在一个单独的函数中,以便它在鼠标事件之间被清除。

关于javascript - React.js 映射如何改变单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51816146/

相关文章:

javascript - 从异步函数获取数据到另一个函数 React JS

javascript - mxGraph - 某些形状在 ReactJS 应用程序中无法正确呈现

javascript - 有选择地更改类的 href

javascript - 在所有设备和浏览器中使用 jquery 滚动到特定 div

javascript - 启用/禁用带有虚拟文本区域的 Android 虚拟键盘

html - 将年份值限制为只有 4 位数字

javascript - jQuery:点击div上的指示器

javascript - 传递给函数的元素是字符串还是对象?

javascript - 关于多功能应用程序的 State 与 Flux Stores 的问题

html - react : How to make <td> collapse as column in a <tr> in mobile view