Я хочу сохранить мой фрагмент в магазине. Однако сейчас у меня возникают некоторые проблемы, я получаю идентификатор фрагмента с сервера только после того, как я выполню вызов 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;