как вызвать api изначально чтобы сохранить пост - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу сохранить мой фрагмент в магазине. Однако сейчас у меня возникают некоторые проблемы, я получаю идентификатор фрагмента с сервера только после того, как я выполню вызов API. Поэтому в первый раз мне нужно отправить только вызов snipetTile и snippetDescription для вызова API. Я хочу, чтобы snippetId проверил, существует ли запись или нет, и обновил ее. Как не указывать snippetId в вызове api / savesnippets api при первом создании сниппета? Я хочу, чтобы только вызовы snippetTitle и snippetDescription отправлялись вызову API, так как я получу snippetId в качестве ответа сервера, если все пойдет хорошо. Прямо сейчас полезная нагрузка моего вызова API выглядит примерно так: this .

codesandbox

actions. js где я вызываю api

import { SAVE_POST, UPDATE_POST, RETRIEVE_POST, HOME_LOADED } from "./types";
import axios from "axios";
export const savePost = ({
  snippetId,
  snippetDescription,
  snippetTitle
}) => async dispatch => {
  const config = {
    headers: {
      "Content-Type": "application/json"
    }
  };
  let snippetData = { snippetId, snippetDescription, snippetTitle };
  try {
    if (snippetId == null) {
      const res = await axios.post(
        "/api/save",
        JSON.stringify(snippetData),
        config
      );
      snippetData.snippetId = res.data;  //cause I only get snippetId from the server
      dispatch({
        type: SAVE_POST,
        payload: snippetData
      });
    } else {
      await axios.post("/api/update", JSON.stringify(snippetData), config);
      dispatch({
        type: UPDATE_POST,
        payload: snippetData
      });
    }
  } catch (err) {
    console.log(err);
  }
};

редактор. js

import React, { Component } from "react";
import { connect } from "react-redux";
import { savePost, retrievePost } from "./actions/posts";

class Editor extends Component {
  constructor(props) {
    super(props);

    this.state = {
      title: "",
      enteredText: ""
    };
  }
  componentDidMount() {
    //Load the snippet
    retrievePost(this.props.match.params.snippetId);
  }

  // Save Snippet
  performSave = snippets => {
    console.log("save function clicked");
    const { enteredText, title } = this.state;
    this.props.savePost({
      snippetId: this.props.match.params.snippetId, //this should be null when initially I'm creating a new post
      snippetDescription: enteredText,
      snippetTitle: title
    });
  };
  render() {
    return (
      <>
        <input
          type="text"
          id="titletext"
          placeholder="Enter title here"
          limit-to="64"
          className="inptxt"
          onChange={title => this.setState({ title })}
        />
        <button className="btn savebtn" onClick={this.performSave}>
          Save Snippet
          <i className="fas fa-save" />
        </button>

        <textarea
          name="enteredText"
          onChange={enteredText => this.setState({ enteredText })}
        />
      </>
    );
  }
}

const mapStateToProps = state => ({
  snippets: state.snippets
});

export default connect(
  mapStateToProps,
  { savePost, retrievePost }
)(Editor);

редуктор. js

import {
  SAVE_POST,
  UPDATE_POST,
  RETRIEVE_POST,
  HOME_LOADED
} from "../actions/types";

import { initialState } from "../store";

export default function(state = initialState, action) {
  const { type, payload } = action;
  switch (type) {
    case SAVE_POST:
      return {
        ...state,
        snippets: [payload, ...state.snippets] //this payload is only the snippetId right and not the actual snippet??
      };
    case UPDATE_POST:
      const newState = state.filter(
        post => post.snippetId !== payload.snippetId
      );
      return [...newState, payload];

    case RETRIEVE_POST:
      const newwState = state.filter(
        post => post.snippetId !== payload.snippetId
      );
      return [...newwState, payload];
    case HOME_LOADED:
      return {
        ...state,
        snippets: payload
      };
    default:
      return state;
  }
}

store. js

import { createStore, applyMiddleware } from "redux";
import thunk from "redux-thunk";
import posts from "./reducers/posts";

export const initialState = {
  snippets: [
    {
      snippetId: "1",
      snippetTitle: "test",
      snippetDescription: "test test"
    },
    {
      snippetId: "2",
      snippetTitle: "post2",
      snippetDescription: "post 2 post2"
    }
  ]
};
const store = createStore(posts, applyMiddleware(thunk));
export default store;

Ответы [ 2 ]

1 голос
/ 06 апреля 2020
// consider splitting your code with functions
const addToState = (state, action) => {
const cloneSnippets = JSON.stringify(JSON.parse(state.snippets)) // for deep copy
cloneSnippets.push(action.payload) // payload contains all the snipets info (id, descrip.., )
  return {
    ...state,
    snippets : cloneSnippets
  }
}

case SAVE_POST:
   return addToState(state, action)
}`
1 голос
/ 05 апреля 2020

Обновление Действие. js

import { SAVE_POST, UPDATE_POST, RETRIEVE_POST, HOME_LOADED } from "./types";
import axios from "axios";
export const savePost = ({
  snippetId,
  snippetDescription,
  snippetTitle
}) => async dispatch => {
const config = {
headers: {
  "Content-Type": "application/json"
}
};

// remove snippetId here --------------------------------------
    let snippetData = { snippetDescription, snippetTitle };
// --------------------------------------

try {
 if (snippetId == null) {
  const res = await axios.post(
    "/api/save",
    JSON.stringify(snippetData),
    config
  );
  snippetData.snippetId = res.data;  //cause I only get snippetId from the server
  dispatch({
    type: SAVE_POST,
    payload: snippetData
  });
} else {

//add snippetId here for update use only --------------------------------------
  await axios.post("/api/update", JSON.stringify({...snippetData, snippetId}), config); 
// --------------------------------------
  dispatch({
    type: UPDATE_POST,
    payload: snippetData
  });
}
} catch (err) {
  console.log(err);
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...