【发布时间】:2024-01-30 06:05:01
【问题描述】:
我有一个这样的对象数组“电影”:
{
id: "some id",
title: "some title",
actors: []
}
如您所见,演员数组保持为空,因为我在添加电影时没有添加演员。我想稍后添加演员,同时在 http://localhost:3000/movies/<movieId> 上。
我通过这个表格做到这一点。我只是从现有的演员列表中选择一个演员。
const PostForm = ({ addActorToMovie, movie, actors, history }, props) => {
const handleSubmit = (values) => {
addActorToMovie(values);
// history.push(`/movies/${movie.id}`);
};
let actorsList =
actors.length > 0 &&
actors.map((item, i) => {
return (
<option value={`${item.firstName}, ${item.lastName}`}>
{item.firstName + item.lastName}{" "}
</option>
);
});
return (
<div>
<h3>Add Actor</h3>
<Formik
initialValues={{
actor: "",
}}
onSubmit={(values) => handleSubmit(values)}
enableReinitialize={true}
>
<Form>
<Field name="actor" component="select">
<option value="null"> </option>
{actorsList}
</Field>
<button type="submit">Zatwierdz</button>
</Form>
</Formik>
</div>
);
};
const mapStateToProps = (state, props) => {
return {
movie: state.movie,
actors: state.actors,
};
};
const mapDispatchToProps = {
addActorToMovie,
};
export default withRouter(
connect(mapStateToProps, mapDispatchToProps)(PostForm)
);
表格有效。虽然不是为我的actors array 增加价值。它在 movies 数组下创建一个新对象,如下所示:
actors: {actor: 'Some actor name'}
我的减速器看起来像这样。可能这是问题的根源,但我真的不知道该怎么做。
export const movieReducer = (state = [], action) => {
switch (action.type) {
case "MOVIE_ADD":
return [...state, action.payload];
case "MOVIE_DELETE":
return [...state.filter((el) => el.id !== action.payload.id)];
case "MOVIEACTOR_ADD":
return {
...state,
actors: action.payload
};
default:
return state;
}
};
我要做的当然是将我在Formik 中输入的演员推送到指定电影的数组中。
【问题讨论】:
-
你提到了一个 movies 数组,我们需要查看 reducer 中的状态形状才能正确复制 movies 数组,在这种情况下,
ADD_ACTOR_TO_MOVIE应该包含它正在向哪个电影添加演员。我们还应该看到正在调度操作的 UI 组件。
标签: reactjs redux react-redux