在React JS中独立更改颜色

时间:2019-05-16 05:30:29

标签: javascript arrays reactjs

我在一个桌子内有三个<td>。我想独立更改<td>的颜色。 onClick,将弹出一个模态,您可以选择颜色。现在,当我将状态设置为颜色时,所有<td>都会更改其背景颜色。我想独立更改每个<td>的颜色。因此,一个<td>可能有红色,另一个<td>将有绿色,而其他<td>将有黄色。

 state = { visible: false, color: "", text: ""  };
     showModal = () => {
    this.setState({
      visible: true
    });
  };
     boxes1 = (value, text) => {
        console.log("dssdf", value);
        this.setState(
          {
            color: value,
            text: text
          },
          () => console.log("this is wt", this.state.color)
        );
      };

      boxes2 = (value, text) => {
        console.log("vf", value);
        this.setState(
          {
            color: value,
            text: text
          },
          () => console.log("this is wt", this.state.color)
        );
      };

      boxes3 = (value, text) => {
        console.log("sds", value);
        this.setState(
          {
            color: value,
            text: text
          },
          () => console.log("this is wt", this.state.color)
        );
      };

     render() {
        const yellow = "yellow";
        const blue = "blue";
        const reenter code hered = "red";
        const text = "colors";

        let s = [1, 2, 3];

        let d = s.map(tables => (
          <div>
            <table
              style={{
                border: "1px solid black",
                width: "70px",
                background: `${this.state.color}`
              }}
            >
              <thead>
                <tr>
                  <td onClick={this.showModal}>{this.state.text}Change 
                   colors
                  </td>
                </tr>
              </thead>
            </table>
          </div>
        ));
     return (
          <div>
            {d}
            <Modal
              title="Basic Modal"
              visible={this.state.visible}
              onOk={this.handleOk}
              onCancel={this.handleCancel}
            >
              <div className="boxes" onClick={()=>this.boxes1(yellow,text)}>
               YELLOW
              </div>
              <div className="boxes" onClick={() => this.boxes2(red,text)}>
               RED
              </div>
              <div className="boxes" onClick={() => this.boxes3(blue,text)}>
               BLUE
              </div>
            </Modal>
          </div>
        );
      }
    }

预期:单击单个<td>时,背景颜色应仅针对该<td>更新进行更新。

实际:点击后,所有<td>的背景色都会改变

2 个答案:

答案 0 :(得分:1)

我们必须有多个项目来表示多个div元素,否则将失败,即更改所有div的颜色。
以下是代码:

state = { box1: {visible: false, color: "", text: ""},
box2: {visible: false, color: "", text: ""},
box3: {visible: false, color: "", text: ""},  };

     showModal = () => {
    this.setState({
      visible: true
    });
  };
   boxesChange = (value, text, id) => {
    const box={
            color: value,
            text: text
          };        
    this.setState(
          `${id}`:box,
          () => console.log("this is wt", this.state.color)
        );
      };

     render() {
        const yellow = "yellow";
        const blue = "blue";
        const reenter code hered = "red";
        const text = "colors";

        let s = [1, 2, 3];

        let d = s.map(tables => (
          <div>
            <table
              style={{
                border: "1px solid black",
                width: "70px",
                background: `${this.state.color}`
              }}
            >
              <thead>
                <tr>
                  <td onClick={this.showModal}>{this.state.text}Change 
                   colors
                  </td>
                </tr>
              </thead>
            </table>
          </div>
        ));
     return (
          <div>
            {d}
            <Modal
              title="Basic Modal"
              visible={this.state.visible}
              onOk={this.handleOk}
              onCancel={this.handleCancel}
            >
              <div id="box1" className="boxes" onClick={()=>this.boxes1(yellow,text,id)}>
               YELLOW
              </div>
              <div id="box2" className="boxes" onClick={() => this.boxes2(red,text,id)}>
               RED
              </div>
              <div id="box3" className="boxes" onClick={() => this.boxes3(blue,text,id)}>
               BLUE
              </div>
            </Modal>
          </div>
        );
      }
    }

答案 1 :(得分:0)

基于元素索引的动态样式呈现建议

假设您在下面渲染了多个元素,这只是一个示例,可以根据元素的索引将动态样式应用于元素,单击该索引可以更改特定的元素样式:

伪代码:

const myStyleBackgroundColor = {};

allElementArray.map((item,index)=>
<div onClick={(e)=>onClickHandle(index)} style={{backgroundColor : myStyleBackgroundColor[index] ? myStyleBackgroundColor[index] : "#FFF" }}>
This is the div which will change color once clicked based on index
</div>
);

onClickHandle(index){
myStyleBackgroundColor [index] = "color";
// apply rest of index a default color
}

注意:上面的常量也可以是处于本地状态的变量数组。