【eslint】react/no-unstable-nested-components

eslint报错

[react/no-unstable-nested-components] Declare this component outside parent component “HelpModal” or memoize it. If you want to allow component creation in props, set allowAsProps option to true.
在这里插入图片描述
错误代码:

<ReactMarkdown
  remarkPlugins={[gfm]}
  components={{
    // 在这里
    code({ node, inline, className, children, ...props }) {
      const match = /language-(\w+)/.exec(className || '');
      return !inline && match ? (
        <SyntaxHighlighter
          children={String(children).replace(/\n$/, '')}
          style={dark}
          language={match[1]}
          PreTag="div"
          {...props}
        />
      ) : (
        <code className={className} {...props}>
          {children}
        </code>
      );
    },
  }}
>
  {helpText}
</ReactMarkdown>
解决

参考:How to fix ‘eslint-disable-next-line react/no-unstable-nested-components’

将代码抽离出来,并使用useCallback

  const renderCodeMarkdown = useCallback(({ node, inline, className, children, ...props }) => {
    const match = /language-(\w+)/.exec(className || '');
    return !inline && match ? (
      <SyntaxHighlighter style={dark} language={match[1]} PreTag="div" {...props}>
        {String(children).replace(/\n$/, '')}
      </SyntaxHighlighter>
    ) : (
      <code className={className} {...props}>
        {children}
      </code>
    );
  }, []);

<ReactMarkdown
  remarkPlugins={[gfm]}
  components={{
    // 在这里
    code: renderCodeMarkdown,
  }}
>
  {helpText}
</ReactMarkdown>

react-markdown官方文档中,有指出components属性的用法,html标签code作为key,不同标签有不同的props
在这里插入图片描述

另一个例子

在使用antd Select组件dropdownRender属性的时候,如果根据官方文档的写法也会存在eslint校验不通过的情况。

在这里插入图片描述
在这里插入图片描述

所以,同上处理方式,解决如下:

const renderDropdown = useCallback(
  (menu) => {
    return (
      <>
        {menu}
        <Divider style={{ margin: '8px 0' }} />
        <Space style={{ padding: '0 8px 4px' }}>
          <Input
            placeholder={`${t('shark-please-input')} ${t('shark-fe-case-create-start-page')}`}
            ref={inputRef}
            value={pagePathName}
            onChange={(e) => setPagePathName(e.target.value)}
          />
          <Button type="text" icon={<PlusOutlined />} onClick={addPagePathItem} disabled={!pagePathName}>
            {t('shark-add')}
          </Button>
        </Space>
      </>
    );
  },
  [addPagePathItem, pagePathName, t],
);

<Select
  style={{ width: 300 }}
  placeholder={t('shark-fe-case-create-start-page') as string}
  // 在这里
  dropdownRender={renderDropdown}
  options={pagePathOpts}
/>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值