Как обновить массив с помощью приставки - PullRequest
1 голос
/ 09 октября 2019

Я использую response-redux для создания простого приложения CRUD. Возможность импортировать заголовки и описания из входных данных, сохранять их в массиве и удалять их была реализована, но возможность их изменять сложна и требует помощи.

action.js

export const addPosting = (title, description) => {
    return {
        type: ADD_POSTING,
        post: {
            id: nextId++,
            title,
            description
        }
    };
}

export const updatePosting = (payload) => {
    return {
        type: UPDATE_POSTING,
        payload
    }
}

export const deletePosting = (id) => {
    return {
        type: DELETE_POSTING,
        id
    }
}

postReducer.js

const initialState = [{
    id: 1,
    title: ' This is First Post',
    description: 'Lorem ipsum dolor sit amet consectetur, adipisicing elit.',
}]

const posts = (state = initialState, action) => {
    switch (action.type) {
        case ADD_POSTING:
            return state.concat(action.post);
        case DELETE_POSTING:
            return state.filter(post => post.id !== action.id);
        case UPDATE_POSTING:
            return // help
        default:
            return state;
    }
};

Метод, который я попробовал, не был изменен.

case UPDATE_POSTING:
            return state.map(post => post.id === action.id ? {
                ...action.post,
            } :
            post
            )

action state

form.jsx

import React, { useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { updatePosting } from '../store/actions';

const Modal = ({ post, modal, close }) => {
  // update redux
  const posts = useSelector(state => state.posts);
  const dispatch = useDispatch();

  const onUpdate = (title, description) =>
    dispatch(updatePosting(title, description));

  // inputs
  const [inputs, setInputs] = useState({
    title: post.title,
    description: post.description,
  });

  const { title, description } = inputs;

  const onChange = e => {
    const { value, name } = e.target;
    setInputs({
      ...inputs,
      [name]: value,
    });
  };

  const onSubmit = e => {
    e.preventDefault();
    onUpdate(title, description);
    setInputs({
      title: post.title,
      description: post.description,
    });
  };

  return (
    <React.Fragment>
      {modal ? (
    <React.Fragment>
      <div className="modal-container">
        <form className="modal" onSubmit={onSubmit}>
          <div className="title">
            <input
              className="titleInput"
              type="text"
              name="title"
              required
              value={title}
              onChange={onChange}
            />
            <button onClick={close}>x</button>
          </div>
          <div className="des">
            <textarea
              name="description"
              className="modal-des"
              cols="30"
              rows="10"
              required
              value={description}
              onChange={onChange}
            ></textarea>
          </div>
          <button onSubmit={onSubmit}>submit</button>
        </form>
      </div>
    </React.Fragment>
      ) : null}
    </React.Fragment>
  );
};

export default Modal;

Благодарим Вас за помощь в решении этой проблемы.

Ответы [ 4 ]

1 голос
/ 09 октября 2019

Ваша проблема связана с тем, как вы используете объект action. Он содержит ваше сообщение как payload свойство, как вы указали в методе действия:

export const updatePosting = (payload) => {
return {
    type: UPDATE_POSTING,
    payload
}

}

Таким образом, ваш пост может быть доступен с помощью action.payload

case UPDATE_POSTING:
   return state.map(post => {
     if(post.id === action.payload.id){
        post = action.payload;
     }
   }
  )
0 голосов
/ 09 октября 2019

В вашем коде есть несколько ошибок. Ваш вызов для обновления не предоставляет идентификатор, который вы обновляете: сначала передайте идентификатор сообщения, которое вы изменяете.

const onUpdate = (id, title, description) =>
dispatch(updatePosting(id, title, description));

Затем в своем редукторе:

 case UPDATE_POSTING:
    // find the id which are trying to update with new title and description
    const filtered = state.filter((post) => post.id === action.payload.id);
    filtered.title= action.payload.title;
    filtered.description= action.payload.description;
    return filtered; //according your need post this
0 голосов
/ 09 октября 2019

Похоже, вам нужно выполнить две операции:

1) filter из всех сообщений, которые не имеют обновленного идентификатора сообщения.

2) Добавьте новое сообщение в отфильтрованный массив и верните его как новое состояние.

Обратите внимание, что для этого вам нужно будет отправить id в качестве аргумента при вызове updatePosting.

case UPDATE_POSTING: {
  const filtered = state.filter((post) => post.id !== action.post.id);
  return [ ....filtered, action.post ];
}
0 голосов
/ 09 октября 2019

соответственно:

case UPDATE_POSTING:
            return state.map((post, index) => {
                if (post.id === action.payload.id) {
                    return Object.assign({}, post, {
                        title: action.payload.title,
                        description: action.payload.description,
                        ...
                    })
                }

                return post
            })

в вашем действии:

updatePosting = (post) => ({
    type: UPDATE_POSTING,
    payload: {
        title: post.title,
        description: post.description
    }
})

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...