выберите ячейку в другом столбце в приложении react

#javascript #reactjs #ecmascript-6

#javascript #reactjs #ecmascript-6

Вопрос:

Недавно я работаю над головоломкой с react js. Я хочу выбрать одну ячейку в каждом столбце. но, к сожалению, я этого не сделал. пример кода здесь. Я был бы очень признателен, если вы сможете мне в этом помочь.

Комментарии:

1. Вы хотите выбрать идентификатор строки в каждом столбце?

2. нет, я хочу выбрать только одну ячейку в каждом столбце

3. Если я выберу «2» в столбце 2, будут выбраны «2» в столбцах 1 и 3?

4. нет, она не должна быть выбрана

5. Это означает, что выбран только один?

Ответ №1:

В соответствии с вашим требованием вам необходимо сохранить выбранный столбец и строку, которые связаны.

Вы можете увидеть мой код ниже, я перевел связанный столбец и строку в состояние проверки, после чего просто немного изменил условие для List компонента, чтобы показать bg-danger класс. Кроме того, я удалил onClick функцию в div компоненте, являющемся родительским List компонентом компонента, потому что я думаю, что бесполезно выполнять несколько вызовов функций одновременно для одного и того же действия onClick

App.js

 import "./styles.css";
import List from "./List";
import { useState, useRef } from "react";
export default function App() {
  const [check, setCheck] = useState({});
  const [columnId, setColumnId] = useState(null);
  const refColumnId = useRef(columnId)
  refColumnId.current = columnId;
  const data = [
    { id: 1, listOfNumbers: [1, 2, 3, 4, 5, 6] },
    { id: 2, listOfNumbers: [1, 2, 3, 4, 5, 6] },
    { id: 3, listOfNumbers: [1, 2, 3, 4, 5, 6] }
  ];

  const handleIndex = (column, row) => {
    setCheck({...check, [column]: row})
  };
  
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <div className="row">
        {data.map((data, index) => {
          return (
            <div className="col-md-4">
              <List
                columnId={columnId}
                key={data.id}
                data={data.listOfNumbers}
                getIndex={handleIndex}
                check={check}
                id={data.id}
              />
              ;
            </div>
          );
        })}
      </div>
    </div>
  );
}
 

List.js

 const List = ({ data, getIndex, check, id, columnId }) => {
  const handleCardClick = (column, row) => {
    console.log("columnId : ", columnId);
    console.log("id : ", check);

    getIndex(column, row);
  };
  return (
    <div className="d-flex flex-column">
      {data.map((number, index) => {
        return (
          <div className="card">
            <div
              className={`card-body ${
                check.hasOwnProperty(id) amp;amp; index === check[id] ? "bg-danger" : ""
              }`}
              onClick={() => handleCardClick(id, index)}
            >
              <h3>{number}</h3>
            </div>
          </div>
        );
      })}
    </div>
  );
};

export default List;