我得到了与Antd表单相同的组件,用于添加/编辑文章。路由器中有路由
<Route path="/add" component={ !currentUser ? Login : ArticleEditor } />
<Route path="/article/:id/edit" component={ !currentUser ? Login : ArticleEditor } />
当我单击“编辑”按钮时,我将初始化值添加到表单中,而如果我单击“创建新文章”,则url更改为“/add”,但表单没有更新值。值保留在已编辑的文章中。如何更新表单值?尝试设置initialValues依赖于路径或“id”,但它不起作用。在这种情况下如何更新antd表单值?
const initialValues = this.props.location.pathname === '/add' ? {} : {
title: this.props?.title,
body: this.props?.body,
description: this.props?.description
};
在这里可以看到组件代码-codesandbox链接
该代码的主要问题是,更改url时不会重置表单字段,您可以在ShouldComponentUpdate
中检测路径更改,并将IsLoading
设置为True
,rest应该工作。
更新initialValues
将不起作用,因为antd
执行浅层比较,并且一旦设置了initialValues,您将无法更改它们。
在componentdidupdate
的逻辑中有一个问题,我也更正了这个问题。
import React from "react";
import ErrorsList from "../ErrorsList/ErrorsList";
import userService from "../../services/userService";
import { connect } from "react-redux";
import { push } from "react-router-redux";
import { Form, Input, Button } from "antd";
import { store } from "../../store";
import actionCreators from "../../actionCreators";
const formItemLayout = {
labelCol: { span: 24 },
wrapperCol: { span: 24 }
};
const formSingleItemLayout = {
wrapperCol: { span: 24, offset: 0 }
};
const mapStateToProps = (state) => ({
...state.editor
});
const mapDispatchToProps = (dispatch) => ({
onLoad: (payload) => dispatch(actionCreators.doEditorLoaded(payload)),
onUnload: () => dispatch(actionCreators.doEditorUnloaded()),
onUpdateField: (key, value) =>
dispatch(actionCreators.doUpdateFieldEditor(key, value)),
onSubmit: (payload, slug) => {
dispatch(actionCreators.doArticleSubmitted(payload));
store.dispatch(push(`/`)); //article/${slug}
},
onRedirect: () => dispatch(actionCreators.doRedirect())
});
class ArticleEditor extends React.Component {
constructor(props) {
super(props);
this.id = this.props.match.params.id;
const updateFieldEvent = (key) => (e) =>
this.props.onUpdateField(key, e.target.value);
this.changeTitle = updateFieldEvent("title");
this.changeDescription = updateFieldEvent("description");
this.changeBody = updateFieldEvent("body");
this.changeTagInput = updateFieldEvent("tagInput");
this.isLoading = true;
this.submitForm = () => {
const article = {
title: this.props.title,
description: this.props.description,
body: this.props.body,
tagList: this.props.tagInput.split(",")
};
const slug = { slug: this.props.articleSlug };
const promise = this.props.articleSlug
? userService.articles.update(Object.assign(article, slug))
: userService.articles.create(article);
this.props.onSubmit(promise, this.props.articleSlug);
};
}
componentDidUpdate(prevProps, prevState) {
if (this.props.match.params.id !== prevProps.match.params.id) {
if (prevProps.match.params.id) {
this.props.onUnload();
}
this.id = this.props.match.params.id;
if (this.id) {
return this.props.onLoad(userService.articles.get(this.id));
}
this.props.onLoad(null);
}
this.isLoading = false;
}
componentDidMount() {
if (this.id) {
this.isLoading = true;
return this.props.onLoad(userService.articles.get(this.id));
}
this.isLoading = false;
this.props.onLoad(null);
}
componentWillUnmount() {
this.props.onUnload();
}
shouldComponentUpdate(newProps, newState) {
if (this.props.match.params.id !== newProps.match.params.id) {
this.isLoading = true;
}
return true;
}
render() {
const { errors } = this.props;
const initialValues = {
title: this.props?.title,
body: this.props?.body,
description: this.props?.description,
tags: this.props?.tagList
};
return this.isLoading ? (
"loading..."
) : (
<div className="editor-page">
<div className="container page">
<div className="">
<div className="">
<ErrorsList errors={errors}></ErrorsList>
<Form
{...formItemLayout}
initialValues={initialValues}
onFinish={this.submitForm}
>
<Form.Item
label="Title"
name="title"
placeholder="Article Title"
rules={[
{
required: true,
message: "Please input article title"
}
]}
>
<Input onChange={this.changeTitle} />
</Form.Item>
<Form.Item
label="Description"
name="description"
placeholder="Short description"
rules={[
{
required: true,
message: "Please input article description"
}
]}
>
<Input onChange={this.changeDescription} />
</Form.Item>
<Form.Item
name="body"
label="Article Text"
placeholder="article text"
>
<Input.TextArea onChange={this.changeBody} />
</Form.Item>
<Form.Item name="tags" label="Tags" placeholder="Enter tags">
<Input onChange={this.changeTagInput} />
</Form.Item>
<Form.Item {...formSingleItemLayout}>
<Button
className="editor-form__btn"
type="primary"
htmlType="submit"
disabled={this.props.inProgress}
>
Submit Article
</Button>
</Form.Item>
</Form>
</div>
</div>
</div>
</div>
);
}
}
export default connect(mapStateToProps, mapDispatchToProps)(ArticleEditor);
看看这个分叉的CodeSandBox。
我目前正在上Java课,教授告诉我们,理解链接的一个好方法是制作双向链表。我做了一个单链表,但是我很难把它转换成双向链表。所以我想知道是否有人能给我任何建议,以确保我的最后一个号码与前一个号码相连?如果前面的数字和最后一个数字连接到null。这是代码的一部分,如果你想得到更多,只要问,我会发布。 用于添加元素等的代码。这是我试图让尾部连接到最后一个数字的尝试。 下面的代码是insert函数,我需要
我刚开始使用,我已经创建了一个具有排序功能的表,但我需要更改排序器工具提示上的文本。 分类器工具提示:- 谢谢你,如果你需要任何额外的代码片段,请让我知道。
问题内容: 我使用JBoss utils(JAX-WS兼容)生成了一个web服务客户机,使用Eclipse的“来自wsdl的web服务客户机”。 所以,我提供的唯一东西是指向web服务WSDL的url。 现在,web服务提供者告诉我更改web服务的“客户端端点应用程序访问的url”。 它是什么以及如何改变它? 问题答案: 在IMO中,提供者告诉你更改服务端点(即到web服务的位置),而不是客户端端
我使用Springfox Swagger2与Spring启动1.5.9。 我可以在此链接上访问swagger UI。 http://localhost:8090/swagger-ui.html 我怎么能改变它是可用的以下网址? http://localhost:8090/my/custom/path/swagger-用户界面。html
问题内容: 嘿,我注意到在浏览GitHub存储库时,它使用AJAX加载每个文件夹/文件。 我了解所有这些,我只是想知道他们如何更改URL。您可以使用JavaScript获取并设置URL吗?如果是这样,对于将基于JavaScript的网站的一部分添加为书签可能非常有用。(其中的几页,通过JavaScript在其中移动) 谢谢。 问题答案: 它在历史记录操作API中使用了新的push/ pop状态功能
问题内容: 我正在使用ajax表单jquery插件通过ajax提交表单(在对话框中)。 这工作正常,然后我从服务器返回html响应。响应来自我无法修改的标准后重定向php页面。 有没有一种方法可以使用jquery(在ajax回调内部)获取此重定向的URL(最终的GET位置)? 问题答案: 我没有使用过您使用的插件,但是如果您使用jQuery Ajax命令 ,则会收到XMLHttpRequest对象