【问题标题】:OnClick, apply style on one array elementOnClick,在一个数组元素上应用样式
【发布时间】:2019-07-03 13:44:39
【问题描述】:

当我在 textarea 中输入内容,然后单击按钮时,这个新元素会存储在一个数组中,并显示在我的 react 应用程序的列表中。我希望在单击数组元素时交叉它们。

我写了一个函数,当我点击元素时,将“交叉”的状态改变为相反的状态,然后元素的样式会根据它是真还是假而改变。

app.js:

import React from 'react';
import Tasks from './tasks.js';
import Item from './component.js';
import './App.css';



class App extends React.Component {
  state = {
    todolist: [],
    crossed: false
  }

  addData(val) {
    this.setState({ todolist: this.state.todolist.concat(val) },
      () => console.log(this.state.todolist))
  }


  cross() {
    this.setState({ crossed: !this.state.crossed },
      () => console.log(this.state.crossed))
  }

  render() {
    return (
      <div className="App">
        <Tasks onClick={value => this.addData(value)} />

        {
          (this.state.crossed) ? (<ul>
          {this.state.todolist.map((e) => {
          return  <Item
              item={e}
              onClick={(e) => this.cross(e)}
              style={{ textDecoration : 'line-through' }} />}
              )
              }
        </ul>) : (
          <ul>
          {this.state.todolist.map((e) => {
           return <Item
              item={e}
              onClick={(e) => this.cross(e)}
               />}
              )
              }
        </ul>
        )
        }
      </div>

    );
  }
}



export default App;

component.js:

import React from 'react'

class Item extends React.Component{ 
 render(){ return(
        <li onClick={this.props.onClick} style={this.props.style}>{this.props.item}
        </li>
    );
}}
export default Item

tasks.js:

import React from 'react'


class Tasks extends React.Component {

    constructor(props) {
        super(props)
        this.state = {
            value: '',
        }
    }
    handleChange = e => {
        this.setState({ value: e.target.value })
    }

    render() {
        return (<div>
            <textarea value={this.state.value} onChange={this.handleChange} ></textarea>
            <button onClick={() => this.props.onClick(this.state.value)}>Add task</button>
        </div>)

    }

}



export default Tasks

我希望每个元素在我单击它时自行交叉,但是当我单击其中任何一个元素时,所有元素都会交叉。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您应该为每个对象设置一些键来区分,

    addData(val) {
        const tempObj = {
            val: val,
            crossed: false
        }
        this.setState({ todolist: this.state.todolist.concat(tempObj) },
            () => console.log(this.state.todolist))
    }
    

    现在您将为每个对象交叉键。我还没有运行代码,但这应该可以工作。

    cross = e => {
        e.crossed = !e.crossed;
    }
    
    (
    <ul>
        {this.state.todolist.map(e => {
        return  <Item
            item={e}
            onClick={(e) => this.cross(e)}
            style={e.crossed && { textDecoration : 'line-through' }} />} // use ternary operator or this kind of && condition here
            )
            }
    </ul>
    )
    

    【讨论】:

    • 不,由于某种原因,代码不起作用。它显示一个错误:警告:列表中的每个孩子都应该有一个唯一的“关键”道具。
    • 您可以在小提琴或其他地方添加代码以便我提供帮助
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多