首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候进行渲染?

什么时候进行渲染?
EN

Stack Overflow用户
提问于 2021-02-20 21:43:10
回答 1查看 325关注 0票数 1

我的项目使用dvajs(基于redux和redux-saga),下面的代码是在单击按钮后发送请求,通过连接更改状态,然后调用ant design组件message.error amessage.success(类似于警告)来提醒您。

代码语言:javascript
复制
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);

当我单击该按钮时,控制台提示:

警告:呈现方法应该是道具和状态的纯函数;不允许从呈现触发嵌套组件更新。如果有必要,在componentDidUpdate中触发嵌套更新。

当状态发生变化时,组件不是重新呈现吗?提示函数会改变状态吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-21 22:46:01

解决方案:在tip之外调用return

tip只是您正在调用的一个function。您应该在代码的return JSX部分之外调用它。我认为最有意义的做法是在useEffect钩子中调用它,并依赖于statussubmitting。每次statussubmitting更改时,效果都会运行。如果status1submitting虚妄,那么我们称之为tip

代码语言:javascript
复制
const RegisterFC: React.FC<RegisterProps> = (props) => {
    const { registerResponseInfo = {}, submitting, dispatch } = props;
    const { status } = registerResponseInfo;

    const handleSubmit = (values: RegisterParamsType) => {
        dispatch({
            type: 'register/register',
            payload: { ...values },
        });
    };

    React.useEffect(() => {
        if (status === '1' && !submitting) {
            tip('error',
                intl.formatMessage({
                    id: 'pages.register.status1.message',
                    defaultMessage: 'error'
                })
            );
        }
    }, [status, submitting]);

    return (
        <div>...</div>
    )
}

解释

呈现方法应该是道具和状态的纯函数。

组件的呈现部分(类组件中的render()或函数组件中的return )是根据propsstate的当前值为组件创建JSX (React )标记的部分。它不应该有任何副作用。它创建并返回JSX,仅此而已。

调用tip是一个副作用,因为它修改了全局antd messsage对象。这意味着它不应该出现在代码的render部分。副作用通常在useEffect钩子内部处理。

您正在尝试有条件地呈现tip,就像有条件地呈现组件一样。问题是tip,而不是组件。函数组件是返回JSX元素的函数。tip是一个不返回任何内容的void函数,因此不能呈现它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66296856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档