简体   繁体   中英

Data pushed to array in existing object with axios

I wonder if I can use axios.post on localhost:3000/episodes to push some data to a specific array.

I have an object which looks like this:

 {
      "title": "675756",
      "release_date": "2022-01-16",
      "series": "Better Call Saul",
      "img": "https://upload.wikimedia.org/wikipedia/en/0/03/Walter_White_S5B.png", 
      "characters": [],
      "id": 1
    }

I want to add the id of characters to an array. I do it by form and then I handle the submit like this:

const handleSubmit = (values) => {
    console.log("dodano aktora do filmu!");
    console.log(values);
    addActorToMovie(values);

    history.goBack();
  };

Here is the addActorToMovie definition:

export const addActorToMovie = (resp) => ({
  type: types.ADD_CHAR_TO_MOVIE,
  payload: resp,
});

and the reducer:

 case types.ADD_CHAR_TO_MOVIE:
      console.log(action.payload);
      return {
        ...state,
        ...state.episodes.map(function (item) {
          return item.id === action.payload.episodeId
            ? {
                id: item.id,
                title: item.title,
                release_date: item.release_date,
                series: item.series,
                img: item.img,
                characters: [...item.characters, action.payload.actor],
              }
            : { ...item };
        }),
      };

It all works, but the problem is that I don't want to do it locally. I'm using a database with json-server, and I want to do an Axios Request so that it would add the data to the database . And I don't know how to do this, when I use axios.post it adds an object to my episodes array, if I'm using axios.put it changes an object. Is there any possibility to push the data to an array as I do it with the code above, but with axios so that it would be added to database ?

My approach looked like this:

export const addActorToMovieAxios = (value) => {
  console.log(value);
  return async (dispatch) => {
    try {
      const response = await axios.post(
        `http://localhost:3000/episodes/`,
        value
      );
      console.log(response);
      dispatch(addActorToMovie(response.data));
    } catch (ex) {
      console.log(ex);
    }
  };
};

but as I said, this does add a new object to an array.....

"episodes": [
    {
      "title": "675756",
      "release_date": "2022-01-16",
      "series": "Better Call Saul",
      "img": "https://upload.wikimedia.org/wikipedia/en/0/03/Walter_White_S5B.png",
      "characters": [],
      "id": 1
    },
    {
      "episodeId": 1,
      "actor": "1",
      "id": 2
    }
  ]

In your dispatch function you are referring to the episodes array.
You shoud explicitely refer to the characters array.
Try this

export const addActorToMovieAxios = (value) => {
  console.log(value);
  return async (dispatch) => {
    try {
      const response = await axios.post(
        `http://localhost:3000/episodes/`,
        value
      );
      console.log(response);
      dispatch(addActorToMovie(response.data.characters));
    } catch (ex) {
      console.log(ex);
    }
  };
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM