Задать вопрос
Ответы пользователя по тегу React
  • Как проверить что компонент отрендерился уже один раз и в последующие разы рендерить его по другому?

    0xD34F
    @0xD34F Куратор тега React
    "Рендерить его по другому" - подход неверный.

    Надо разделять предустановленные значения, и те, что вводит пользователь. Так что просто числа хранить уже не получится - наверное, стоит сделать объект, который содержит в себе значение ячейки и её disabled. Как-то так.
    Ответ написан
    Комментировать
  • Как сделать проверку на совпадение содержимого ячеек судоку?

    0xD34F
    @0xD34F Куратор тега React
    Пытался нагуглить, но самостоятельно разобраться в простыне кода не могу.

    Что-то вы странное нагуглили - на всё про всё строчек десять, никакой "простыни".

    Вычисляете координаты начала текущего блока, затем обходите его (два цикла, один вложен в другой, от начальных координат до начальных + 3). Типа так.
    Ответ написан
    5 комментариев
  • Как обработать нажатие на любую ячейку в таблице?

    0xD34F
    @0xD34F Куратор тега React
    handleTdClick(item) {

    Интересно, а как вы собираетесь определять, какой именно элемент следует изменить, если item - число?

    Вместо значения нужны его индексы:

    {this.state.rows.map((row, rowIndex) => (
      <tr>
        {row.map((item, colIndex) => (
          <td
            onClick={this.onTdClick}
            data-row={rowIndex}
            data-col={colIndex}
            className={item ? 'not-empty' : 'empty'}
          >
            {item}
          </td>
        ))}
      </tr>
    ))}

    onTdClick = ({ target: { dataset: d } }) => {
      const row = +d.row;
      const col = +d.col;
    
      this.setState(({ rows }) => ({
        rows: rows.map((n, i) =>
          i === row
            ? n.map((m, j) => j === col ? +!m : m)
            : n
        )
      }));
    }
    Ответ написан
    Комментировать
  • Почему store меняется а страница не рендерится?

    0xD34F
    @0xD34F Куратор тега React
    Вы возвращаете тот же самый массив cards (и тот же самый элемент cards, и то же самое свойство entries обновляемого элемента cards), что и был, поэтому изменений как бы и не было. Делайте копии:

    const addEntry = (state, action) => {
      const cards = [...state.cards];
      const index = cards.findIndex(n => n.id === action.id);
      const card = {...cards[index]};
      card.entries = [ ...card.entries, { id: Math.random().toString(36).substring(7) } ];
      cards[index] = card;
      return { cards };
    };

    Кстати, я правильно понимаю, что

    const addEntry = (state, action) => {

    - это не весь редьюсер, а эта функция вызывается внутри редьюсера? Как-то так, да?
    Ответ написан
    Комментировать
  • Почему внутренний React компонент не ререндерится после изменения стейта?

    0xD34F
    @0xD34F Куратор тега React
    Проблема в том, что компонент Form, некоторые элементы которого зависят от стейта - не ререндерятся.

    "Некоторые" - это, видимо, инпуты (плейсхолдеры) и кнопка (текст). Почему не обновляются - да потому, что значение isFormStateChange формы, от которого они зависят (кстати, не "от стейта" - стейта у вас там нет, что за бред-то?), устанавливается лишь единожды, в конструкторе, и изменение isFormStateChange родительского компонента никак на него не влияет.

    Я так понимаю, вы стремились к чему-то такому?
    Ответ написан
    Комментировать
  • Вопрос Reactjs специалистам, почему не срабатывает ограничение по позиции left?

    0xD34F
    @0xD34F Куратор тега React
    Как-то у вас всё многословно и сильно переусложнено. Зачем целиком переопределять obj и несколько раз вызывать setState? - результат следующего вызова перетирает результат предыдущего, наверняка причина того, что ограничения координат не применяются, кроется где-то тут. Наверное, стоит создавать объект один раз, сразу с нужными значениями свойств, как-то так:

    class App extends React.Component {
      state = {
        divStyle: {
          display: 'flex',
          alignItems: 'center',
          width: '1000px',
          height: '500px',
          outline: '1px solid red',
          position: 'relative',
        },
        move: {
          position: 'absolute',
          width: '200px',
          height: '100px',
          outline: '1px solid green',
          left: 100,
          top: 200,
        },
      }
    
      handlerMouseDown = e => {
        this.deltaX = e.pageX - this.ourdiv.offsetLeft;
        this.deltaY = e.pageY - this.ourdiv.offsetTop;
        window.addEventListener('mousemove', this.handlerMouseMove);
      }
    
      handlerMouseUp = e => {
        window.removeEventListener('mousemove', this.handlerMouseMove);
      }
    
      handlerMouseMove = ({ pageX }) => {
        this.setState(({ move }) => ({
          move: {
            ...move,
            left: Math.min(700, Math.max(100, pageX - this.deltaX)),
          },
        }));
      }
    
      render() {
        return (
          <div>
            <div style={this.state.divStyle}>
              <div
                ref={ourdiv => this.ourdiv = ourdiv}
                style={this.state.move}
                onMouseDown={this.handlerMouseDown}
                onMouseUp={this.handlerMouseUp}
              ></div>
            </div>
          </div>
        );
      }
    }
    Ответ написан
    2 комментария
  • Как проверить e.target элемент на наличие onClick?

    0xD34F
    @0xD34F Куратор тега React
    Не надо ничего проверять, просто отменяйте всплытие события в обработчике клика по кнопке.
    Ответ написан
    Комментировать
  • Почему не могу отрендерить элементы из объекта?

    0xD34F
    @0xD34F Куратор тега React
    А вы вообще понимаете, что делает метод forOwn? Явно нет. Он перебирает собственные свойства объекта, передавая их в коллбек. Всё. Что вы там из коллбека вернёте - неважно, forOwn вернёт переданный объект. Документацию могли бы и почитать.

    Вам lodash тут не нужен:

    Object.keys(notif).map(key => <div key={key}>{key} - {notif[key]}</div>)

    А если всё же без него никак, то используйте map вместо forOwn:

    _.map(notif, (value, key) => <div key={key}>{key} - {value}</div>)
    Ответ написан
    Комментировать
  • Почему выходит ошибка Warning: Failed prop type: Invalid prop `component` of type `object` supplied to `Route`, expected `function`. in Route?

    0xD34F
    @0xD34F Куратор тега React
    Почему - так написано же. Передаёте в Route не то, что надо, Auth должен быть функцией, а не объектом.

    Почему Auth объект - непонятно, про свой код вы явно наврали, экспортируется не какой-то там объект, а... ничего. Вообще никакого экспорта не вижу. А должен быть:

    export default class UserForm ...

    И вызов ReactDOM.render в Auth не нужен.
    Ответ написан
  • Как вывести значение из axios в рендер?

    0xD34F
    @0xD34F Куратор тега React
    Можно завести свойство в стейте, содержащее сообщение об ошибке, если имеет не falsy значение - выводить его, как-то так (вместо вашего запроса тут просто setTimeout и генерация случайных данных, но, думаю принцип понятен).
    Ответ написан
    Комментировать
  • Как сделать при нажатие на кнопку в переключающем блоке было обязательное поле?

    0xD34F
    @0xD34F Куратор тега React
    В смысле - вам надо не давать пользователю переходить к следующему вопросу при отсутствие ответа?

    Можно сделать массив полученных от пользователя ответов, и при выборе какого-либо пункта обновлять его по индексу текущего вопроса, кнопке перехода к следующему вопросу назначать disabled в зависимости от количества ответов. Типа так.
    Ответ написан
  • Как сделать поля привязанные к этому блоку?

    0xD34F
    @0xD34F Куратор тега React
    Ну, input'ы у вас уже есть, осталось только добавить обработчик onChange, в котором будет происходить обновление данных. И конечно, чтобы можно было управлять видимостью инпутов независимо, свойство, отвечающее за их отображение, должно быть не одно на все блоки, а у каждого своё:

    class App extends React.Component {
      state = {
        data: [
          '#088A85', '#0B2F3A', '#0B0B3B', '#2A0A29', '#B4045F',
          '#FA58F4', '#A9BCF5', '#58FA82', '#A9F5F2', '#CED8F6',
        ].map((n, i) => ({
          id: i + 1,
          color: n,
          title: `block #${i}`,
          opened: false,
        })),
      }
    
      updateItem(index, key, val) {
        const data = [...this.state.data];
        data[index][key] = val;
        this.setState({ data });
      }
    
      render() {
        return (
          <div>{this.state.data.map(({ id, color, title, opened }, i) => (
            <div key={id}>
              <div
                className="square"
                style={{ backgroundColor: color }}
                onClick={() => this.updateItem(i, 'opened', !opened)}
              >
                <p>{title}</p>
              </div>
              {opened &&
              <div>
                <input
                  value={color}
                  onChange={e => this.updateItem(i, 'color', e.target.value)}
                />
                <input
                  value={title}
                  onChange={e => this.updateItem(i, 'title', e.target.value)}
                />
              </div>}
            </div>))}
          </div>
        )
      }
    }

    .square {
      width: 100px;
      height: 100px;
    }
    Ответ написан
    Комментировать
  • Как написать приложение перестановки набора карточек?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Ну типа вот, дальше допиливайте сами:

    class Game extends React.Component {
      state = {
        panesCurrent: [],
        panesDefault: [ 1, 1, 1, 0, -1, -1, -1 ],
        panesWin: [ -1, -1, -1, 0, 1, 1, 1 ],
      }
    
      componentDidMount() {
        this.reset();
      }
    
      componentDidUpdate() {
        if (this.state.panesCurrent.every((n, i) => n === this.state.panesWin[i])) {
          setTimeout(alert, 25, 'WIN');
        }
      }
    
      onClick(index) {
        const clicked = this.state.panesCurrent[index];
        if (clicked === 0) {
          return;
        }
    
        for (let i = 1; i <= 2; i++) {
          const t = index + clicked * i;
          if (this.state.panesCurrent[t] === 0) {
            const panes = [...this.state.panesCurrent];
            [ panes[index], panes[t] ] = [ panes[t], panes[index] ];
            this.setState({ panesCurrent: panes });
            break;
          }
        }
      }
    
      reset = () => {
        this.setState(({ panesDefault }) => ({
          panesCurrent: [...panesDefault],
        }));
      }
    
      render() {
        return (
          <div>
            <button onClick={this.reset}>reset</button>
            <div className="game">
              {this.state.panesCurrent.map((n, i) => (
                <div
                  className={'pane ' + [ 'left', '', 'right' ][n + 1]}
                  onClick={() => this.onClick(i)}
                ></div>
              ))}
            </div>
          </div>
        )
      }
    }

    .game {
      font-size: 5px;
    }
    
    .pane {
      display: inline-block;
      width: 10em;
      height: 10em;
      margin: 1em;
    }
    
    .pane.right::after,
    .pane.left::after {
      position: relative;
      display: inline-flex;
      justify-content: center;
      align-items: center;
      width: 100%;
      height: 100%;
      font-family: monospace;
      font-size: 4em;
    }
    .pane.right::after {
      content: "-->";
      color: red;
      border: 2px solid red;
    }
    .pane.left::after {
      content: "<--";
      color: lime;
      border: 2px solid lime;
    }
    Ответ написан
    2 комментария
  • Как удалить отфильтрованный элемента массива?

    0xD34F
    @0xD34F Куратор тега React
    Косяк в том, что передаёте в deleteItem индекс элемента отфильтрованного массива, а удаляете из исходного.

    Давайте вместо индексов будем использовать уникальные id (вместо строк в items придётся хранить объекты):

    deleteItem(id) {
      this.setState(({ items }) => ({
        items: items.filter(n => n.id !== id),
      }));
    }

    Полный код
    class App extends React.Component {
      state = {
        items: [...this.props.items.map((n, i) => ({
          id: i + 1,
          value: n,
        }))],
        newItem: '',
        search: '',
      }
    
      addItem = () => {
        this.setState(({ items, newItem }) => ({
          items: [ ...items, {
            id: 1 + Math.max(0, ...items.map(n => n.id)),
            value: newItem,
          } ],
          newItem: '',
        }));
      }
    
      deleteItem(id) {
        this.setState(({ items }) => ({
          items: items.filter(n => n.id !== id),
        }));
      }
    
      onChange = ({ target: { value, name } }) => {
        this.setState(() => ({
          [name]: value,
        }));
      }
    
      render() {
        const search = this.state.search.toLowerCase();
        const filteredItems = this.state.items.filter(n => n.value.toLowerCase().includes(search));
    
        return (
          <div>
            <div>
              <input
                value={this.state.newItem}
                onChange={this.onChange}
                name="newItem"
                placeholder="Add..."
              />
              <button onClick={this.addItem}>Добавить</button>
            </div>
            <div>
              <input
                value={this.state.search}
                onChange={this.onChange}
                name="search"
                placeholder="Search..."
              />
            </div>
            <ul>
              {filteredItems.map(n => (
                <li key={n.id}>
                  {n.value}
                  <button onClick={() => this.deleteItem(n.id)}>Удалить</button>
                </li>
              ))}
            </ul>
          </div>
        );
      }
    }
    
    ReactDOM.render(
      <App
        items={[
          'hello, world!!',
          'fuck the world',
          'fuck everything',
        ]}
      />,
      document.getElementById('app')
    );
    Ответ написан
    1 комментарий
  • Как сделать в таблице разворачивание строк с дополнительной информацией?

    0xD34F
    @0xD34F Куратор тега React
    Ответ написан
    Комментировать
  • Как по клику отрисовывать разные данные?

    0xD34F
    @0xD34F Куратор тега React
    Ответ написан
    Комментировать
  • Как отобразить gridview?

    0xD34F
    @0xD34F Куратор тега React
    Замените

    <Product product={this.props.product} />

    на

    {this.props.product.map(n => <Product key={n.id} product={n} />)}
    Ответ написан
  • Как перебрать массив в объекте?

    0xD34F
    @0xD34F Куратор тега React
    {Object.keys(anyIcons).map(type => (
      <Category>
        <CategoryType>
          {type === 'people' && 'PEOPLE'} 
          {type === 'nature' && 'ANIMALS & NATURE'}
        </CategoryType>
        {anyIcons[type].map(icon => (
          <RedactorEmojiItem data={icon.code}>{icon.title}</RedactorEmojiItem>
        ))}
      </Category>
    ))}
    Ответ написан
    Комментировать
  • Почему не отображается компонент Calendar в React?

    0xD34F
    @0xD34F Куратор тега React
    Неправильно импортируете MyCalendar (это в Hello.js). Должно быть

    import MyCalendar from './MyCalendar';

    вместо

    import { MyCalendar } from './MyCalendar';

    В качестве events передаёте какую-то непонятную функцию вместо массива (это в MyCalendar.js).
    Ответ написан
  • Как отрендерить однотипные компоненты с задержкой между рендером?

    0xD34F
    @0xD34F Куратор тега React
    А чем setTimeout не устраивает? Добавить переменную, отвечающую за количество отображаемых элементов, если её значение меньше общего количества элементов - сделать ей ++ с задержкой. Как-то так.
    Ответ написан
    1 комментарий