@sergemin

Как вставить компонент по нажатию на кнопку?

Делаю todo приложение и зашел в тупик, потому что не получается реализовать задуманную логику.

function Title(props) {
    return (
        <input type="text" value={props.title}/>
    )
}
function Task(props) {
    return (
        <input type="text" value={props.task}/>
    )
}
function Done(props) {
    return (
        <input type="checkbox"/>
    )
}
function Remove(props) {
    return (
        <button onClick={props.onClick}>X</button>
    )
}
class ItemTodo extends React.Component {
    constructor() {
        super();
        this.deleteItem = this.deleteItem.bind(this);
    }
    deleteItem(event) {
        event.target.parentNode.parentNode.removeChild(event.target.parentNode);
    }
    render() {
        return (
            <div className="itemTodo">
                <Title value={this.props.title}/>
                <Task value={this.props.task}/>
                <Done done={this.props.isDone}/>
                <Remove onClick={this.deleteItem}/>
            </div>
        )
    }
}
export default class App extends React.Component {
    constructor() {
        super();
        this.state = {
            title: 'Title',
            task: 'Message',
            isDone: false,
        };
        this.postItem = this.postItem.bind(this);
        this.addItem = this.addItem.bind(this);
        this.valueTitle = this.valueTitle.bind(this);
        this.valueText = this.valueText.bind(this);
    }
    valueTitle(event) {
        this.setState({
            title: event.target.value,
        })
    }
    valueText(event) {
        this.setState({
            task: event.target.value,
        })
    }
    addItem() {
        this.setState({
            isDone: !this.state.isDone,
        });
    }
    postItem() {
       //Этим методом нужно реализовать так, чтобы при нажатии на клавишу компонент ItemTodo вставлялся в div с классом block-todo
        const block = document.querySelector('.header-block');
        return <ItemTodo/>
    }
    render() {
        return (
                <div>
                    <div className="header-app">
                        <h1>My ToDo app with React</h1>
                        <button onClick={this.addItem}>+</button>
                        <div className="header-block">
                            <input id="title" type="text" placeholder="title" onChange={this.valueTitle}/>
                            <input id='task' type="text" placeholder="task" onChange={this.valueText}/>
                            <input id='submit' type="submit" value="Add"
                                    onClick={this.postItem}
                            />
                        </div>
                     </div>
                    <div className="body-app">
                        <div className="block-todo">
                        </div>
                    </div>
                    <div className="footer-app">
                        Footer
                    </div>
            </div>
        )
    }
}


В коде в комментах я оставил пояснение. Поправьте, если я где-то не прав
  • Вопрос задан
  • 1950 просмотров
Решения вопроса 1
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Вам не нужно напрямую работать с DOM'ом как это часто было в jquery коде.
Подумайте следующим образом: у вас есть изменяемое состояние (разное колиество "тудушек" для списка дел) - его можно (а в вашей задаче, думаю и нужно) хранить в state компонента (например в this.state.todos = [ todo1, todo2, todo3 ...])
В render функции вам нужно пробегаться по this.state.todos и генерировать разметку...

По кнопке на добавление, вам нужно устанавливать в this.state.todos новый массив, в котором будет на один элемент больше. При этом, так как state изменится, у вас вызовется функция render, а так как в ней идет генерация разметки в зависимости от того, что лежит в this.state.todos - то вы получите на 1 элемент больше. И так по кругу.

Аналогично реализуется и удаление и редактирование. Вы всегда изменяете что-то в state, реакт перерисовывает для вас компонент и его потомков - вы получаете актуальное состояние.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы