Как использовать одну и ту же функцию для разных элементов в React? - PullRequest
0 голосов
/ 10 сентября 2018

Как я могу использовать одну и ту же функцию для преобразования разных элементов? Могу ли я использовать что-то вроде this.target и т.д?

У меня есть пример, где я хотел переместить компонент Box, когда я нажал кнопку Move Box. Но теперь, независимо от того, на какую кнопку я нажал, трансформируется только первая коробка ...

const handleChangePos = () => {
  let box = document.getElementById("box");
  box.style.transform = `translateY(-20px)`;
};

const n = 4;

function App() {
    return (
      <div className="App">
        <h1>Hero</h1>
        <HeroBox>
            <Box id="box" />
            <button onClick={handleChangePos}>Move Box</button>
        </HeroBox>

        <h2>Sub Hero</h2>
        <SubHeroContainer>
        {[...Array(n)].map((e, i) => (
            <SubHeroBox key={i}>
                <Box2 id="box" />
                <button onClick={handleChangePos}>Move Box</button>
            </SubHeroBox>
        ))}
        </SubHeroContainer>
     </div>
);}

Живой пример: https://codesandbox.io/s/6vxqlo06v3

Идеальный результат, который я хочу получить, - это то, что я нажму на кнопку, тогда соответствующая ячейка изменится, и другие ячейки не будут затронуты.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы можете легко решить эту проблему несколькими способами, но, во-первых, у вас не должно быть нескольких элементов с одинаковым идентификатором. Поскольку у вас уже есть id="Box" для заголовка, я бы предложил сгенерировать остаток с индексами:

 <SubHeroContainer>
        {[...Array(n)].map((e, i) => (
            <SubHeroBox key={i}>
                <Box2 id={`box-${i}`} />
                <button onClick={() => handleChangePos(i)}>Move Box</button>
            </SubHeroBox>
        ))}
 </SubHeroContainer>

Затем вы можете изменить handleChangePos, чтобы принять параметр (индекс) и найти данный элемент:

const handleChangePos = (index) => {
  let box = document.getElementById(index ? `box-${index}` : "box");
  box.style.transform = `translateY(-20px)`;
};

Чтобы избежать передачи индекса, вы также можете использовать event.target.name из события, переданного кнопками при нажатии на них, и объявить кнопку как <button onClick={handleChangePos} name={i} >Move Box</button>, но она почти такая же.

Я бы также предложил не использовать идентификаторы, а вести список refs и изменять их на основе индекса. Вы можете прочитать больше о ссылках здесь: https://reactjs.org/docs/refs-and-the-dom.html

0 голосов
/ 10 сентября 2018

Вам необходимо создать новый компонент, который обернет нужные вам функции. С React вам никогда не нужно звонить document.getElementById

Я отредактировал ваш пример, чтобы создать новый компонент, который сохраняет его смещение в состоянии компонента. Это исправляет это для вспомогательных блоков, но вам нужно будет найти способ сделать его расширяемым и для главного героя.

https://codesandbox.io/s/3vn642j63m

Вот соответствующий компонент, если ссылка умирает:

class Moveable extends React.Component {
  constructor() {
    super();
    this.state = { offset: 0 };
    this.move = this.move.bind(this);
  }
  move() {
    if (this.state.offset === 0) {
      this.setState({ offset: -20 });
    } else {
      this.setState({ offset: 0 });
    }
  }
  render() {
    return [
      <Box2 id="box" style={{transform: `translateY(${this.state.offset}px)`}} />,
      <button onClick={this.move}>Move Box</button>
    ];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...