Реагировать компонент второй раз визуализации проблемы - PullRequest
0 голосов
/ 18 февраля 2019

Я создаю приложение для доски задач и у меня возникла проблема с отображением компонента TasksList в доске из 3 списков: 1 Board -> 3 списка -> N задач

Похоже, что компонент TasksListрендеринг дважды, что нормально, но во 2-й раз кажется, что он возвращает разные значения для каждой задачи (которые неверны в соответствии с моим условным возвратом, и прямо при первом рендере - почему будет разница?)

Я тоже получил это предупреждение.Может быть связано с: Предупреждение: невозможно обновить во время существующего перехода состояния (например, в render).Методы рендеринга должны быть чистой функцией реквизита и состояния.

Функция рендеринга компонента Board.js:

const tasksListsArr = Object.entries(this.state.tasks).map(list => {
            return (
                <TasksList
                    key={list[0]}
                    listrole={list[0]}
                    listTitle={this.state.Lists[list[0]]}
                    tasks={list[1]}
                    listTextChangedHandler={event => this.listTextChangedHandler(list[0], event)}
                    addTaskHandler={() => this.addTaskHandler(list[0])}
                    taskDeleteHandler={this.taskDeleteHandler}
                    moveTaskHandler={this.moveTaskHandler}
                    taskEditHandler={this.taskEditHandler}
                    taskEditApprove={this.taskEditApprove}
                />
            )
        })

Компонент TaskList.js:

import React from "react"
import classes from "./TasksList.module.css"

const TasksList = props => {
    const tasks = props.tasks.map(task => {
        const buttonLeft =
            !task.isEdit && (props.listrole === "inprogress" || props.listrole === "done") ? (
                <button onClick={() => props.moveTaskHandler(task.id, "left")}>left</button>
            ) : null

        const buttonRight =
            !task.isEdit && (props.listrole === "inprogress" || props.listrole === "backlog") ? (
                <button onClick={() => props.moveTaskHandler(task.id, "right")}>right</button>
            ) : null

        const taskUtils = task.isEdit ? null : (
            <div>
                <span onClick={() => props.taskDeleteHandler(props.listrole, task.id)}>X</span>
                <span onClick={() => props.taskEditHandler(props.listrole, task.id)}>edit</span>
            </div>
        )

        const taskContent = task.isEdit ? (
            <div>
                <input
                    type='text'
                    onChange={event => props.listTextChangedHandler(props.listrole, event)}
                />
                <button onClick={props.taskEditApprove(props.listrole, task.id)}>OK</button>
            </div>
        ) : (
            <div>
                <div>{task.text}</div>
            </div>
        )

        return (
            <div key={task.id} className={classes.Task}>
                {buttonLeft}
                {taskContent}
                {buttonRight}
                {taskUtils}
            </div>
        )
    })
    console.log(tasks)

    return (
        <div className={classes.List}>
            <h2 className={classes.ListTitle}> {props.listTitle} </h2>
            <input type='text' onChange={props.listTextChangedHandler} placeholder='Add task...' />
            <button onClick={props.addTaskHandler}>+</button>
            <div className={classes.TasksList}>{tasks}</div>
        </div>
    )
}

экспорт по умолчаниюTasksList

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

OK

props.taskEditApprove вызывается при рендеринге.

Попробуйте props.taskEditApprove (props.listrole, task.id)}> OK

Тогда функция будет вызываться только при взаимодействии.

0 голосов
/ 18 февраля 2019

Я подозреваю, что проблема в компоненте TaskList.Потому что onChange для input и onClick кнопки вызываются при каждом рендеринге, но эти функции обработчика событий должны вызываться только при интеграции пользователя с ним.Чтобы исправить это, измените их на стрелки, чтобы функция вызывалась только тогда, когда мы взаимодействуем.

После изменений, необходимых в TaskList.js

Изменение

     <button onClick={props.taskEditApprove(props.listrole, task.id)}>OK</button>

На

    <button onClick={() => props.taskEditApprove(props.listrole, task.id)}>OK</button>

А

Изменить

    <input type='text' onChange={props.listTextChangedHandler} placeholder='Add task...' />
        <button onClick={props.addTaskHandler}>+. </button>

На

    <input type='text' onChange={event => props.listTextChangedHandler(event)} placeholder='Add task...' />
        <button onClick={() => props.addTaskHandler()}>+</button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...