【发布时间】:2021-02-20 21:43:10
【问题描述】:
我的项目使用dvajs(基于redux和redux-saga),下面的代码是点击按钮后发送请求,通过connect改变状态,然后调用ant design组件message.error一个@ 987654323@(类似alert)提醒
import type { Dispatch } from 'umi';
import ProForm, { ProFormText } from '@ant-design/pro-form';
import { message } from 'antd';
const tip = (type: string, content: string) => {
if (type === 'error') message.error(content, 5);
else message.success(content, 5);
};
const RegisterFC: React.FC<RegisterProps> = (props) => {
const { registerResponseInfo = {}, submitting, dispatch } = props;
const { status } = registerResponseInfo;
const handleSubmit = (values: RegisterParamsType) => {
dispatch({
type: 'register/register',
payload: { ...values },
});
};
return (
<div>
<ProForm
onFinish={(values) => {
handleSubmit(values as RegisterParamsType);
return Promise.resolve();
}}
>
<ProFormText/>
...
{
status === '1' && !submitting && (
tip('error',
intl.formatMessage({
id: 'pages.register.status1.message',
defaultMessage: 'error'
})
)
)
}
<<ProForm>/>
</div>
)
}
const p = ({ register, loading }: { register: RegisterResponseInfo, loading: Loading; }) => {
console.log(loading);
return {
registerResponseInfo: register,
submitting: loading.effects['register/register'],
};
};
export default connect(p)(RegisterFC);
当我点击按钮时,控制台提示:
警告:渲染方法应该是 props 和 state 的纯函数; 不允许从渲染触发嵌套组件更新。如果 必要时,在 componentDidUpdate 中触发嵌套更新。
当状态改变时组件不会重新渲染吗?提示函数会改变状态吗?
【问题讨论】:
-
这里的代码不完整且令人困惑。什么是
p,它叫什么名字?handleSubmit如何访问dispatch? (它在组件内部吗?)我收到另一个错误,这是由于您在div中打印来自tip()的void结果。tip更新全局message对象,但它不返回任何内容。 -
对不起,由于代码太多,我只截取了部分代码。我对代码做了进一步的改进。
p在最后一行被connect调用,handleSubmit应该在组件内部。您的意思是在tip()中添加return? -
tip可以是void,但您应该在组件的returnJSX 之外调用它。在组件主体的某处,if (status === '1' && !submitting) { tip(...); } -
好的,但是如果我将
tip(..)替换为FunctionComponent,则不会出现警告。为什么?代码如下{ status === '0' && !submitting && ( <RegisterMessage />} -
<RegisterMessage />是您要呈现给 DOM 的 JSX 元素。调用tip()的结果是什么都没有。它是void。所以你不能渲染它。
标签: reactjs redux render redux-saga dvajs