修复wangeditor 集成报错

This commit is contained in:
linxd
2025-08-11 11:01:36 +08:00
parent c2e62dfc62
commit d882e9bd55
4 changed files with 67 additions and 44 deletions

View File

@ -1,5 +1,5 @@
import { defineConfig } from 'umi'; import { defineConfig } from 'umi';
import defaultSettings,{antdTheme} from './defaultSettings'; import defaultSettings, { antdTheme } from './defaultSettings';
import PageRoutes from './router.config' import PageRoutes from './router.config'
export default defineConfig({ export default defineConfig({
hash: true, hash: true,

View File

@ -74,34 +74,17 @@ const WangEditor = forwardRef<any, WangEditorProps>(
placeholder || (language === 'zh-CN' ? '请输入内容...' : 'Please enter content...'), placeholder || (language === 'zh-CN' ? '请输入内容...' : 'Please enter content...'),
readOnly, readOnly,
}; };
// 工具:把纯文本包成合法 HTML避免 Slate 只拿到 text node
// 监听value变化 function normalizeHtml(input?: string) {
const s = (input ?? '').toString();
if (!s) return '';
return /[<>]/.test(s) ? s : `<p>${s}</p>`;
}
useEffect(() => { useEffect(() => {
// ✅ 等编辑器准备好之后才更新 html setHtml(normalizeHtml(value)); // ✅ 外部值变化 → 直接同步受控值
if (editor && value !== html) { }, [value]);
try {
const current = editor.getHtml();
if (value !== current) {
setHtml(value);
}
} catch (e) {
console.warn('Editor尚未准备好忽略更新', e);
}
}
}, [value, editor]);
// 及时销毁editor实例重要 useEffect(() => () => editor?.destroy(), [editor]); // ✅ 正确销毁
useEffect(() => {
return () => {
if (editor) {
try {
editor.destroy();
} catch (err) {
console.warn('销毁 editor 失败:', err);
}
}
};
}, []);
// 处理编辑器内容变化 // 处理编辑器内容变化
const handleChange = (newEditor: IDomEditor) => { const handleChange = (newEditor: IDomEditor) => {

View File

@ -35,7 +35,9 @@ const PolicyManageForm: React.FC<PolicyManageFormProps> = ({ id, isEdit, onSucce
contentEn: detail.contentEn, contentEn: detail.contentEn,
}); });
} else { } else {
message.error(response.message || intl.formatMessage({ id: 'policyManage.fetchDetailFailed' })); message.error(
response.message || intl.formatMessage({ id: 'policyManage.fetchDetailFailed' }),
);
} }
} catch (error) { } catch (error) {
console.error('获取政策详情失败:', error); console.error('获取政策详情失败:', error);
@ -102,14 +104,19 @@ const PolicyManageForm: React.FC<PolicyManageFormProps> = ({ id, isEdit, onSucce
} }
if (response && response.success) { if (response && response.success) {
message.success(isEdit message.success(
? intl.formatMessage({ id: 'policyManage.form.updateSuccess' }) isEdit
: intl.formatMessage({ id: 'policyManage.form.addSuccess' })); ? intl.formatMessage({ id: 'policyManage.form.updateSuccess' })
: intl.formatMessage({ id: 'policyManage.form.addSuccess' }),
);
onSuccess(); // 回调父组件 onSuccess(); // 回调父组件
} else { } else {
message.error(response.message || (isEdit message.error(
? intl.formatMessage({ id: 'policyManage.form.updateFailed' }) response.message ||
: intl.formatMessage({ id: 'policyManage.form.addFailed' }))); (isEdit
? intl.formatMessage({ id: 'policyManage.form.updateFailed' })
: intl.formatMessage({ id: 'policyManage.form.addFailed' })),
);
} }
} catch (error: any) { } catch (error: any) {
console.error('表单验证或提交失败:', error); console.error('表单验证或提交失败:', error);
@ -131,45 +138,77 @@ const PolicyManageForm: React.FC<PolicyManageFormProps> = ({ id, isEdit, onSucce
</Form.Item> </Form.Item>
<Tabs activeKey={activeTabKey} onChange={handleTabChange}> <Tabs activeKey={activeTabKey} onChange={handleTabChange}>
<TabPane tab={intl.formatMessage({ id: 'policyManage.form.chineseTab' })} key="zh" forceRender={true}> <TabPane
tab={intl.formatMessage({ id: 'policyManage.form.chineseTab' })}
key="zh"
forceRender={true}
>
<Form.Item <Form.Item
name="titleZh" name="titleZh"
label={intl.formatMessage({ id: 'policyManage.form.titleZh' })} label={intl.formatMessage({ id: 'policyManage.form.titleZh' })}
rules={[{ required: true, message: intl.formatMessage({ id: 'policyManage.form.titleZhRequired' }) }]} rules={[
{
required: true,
message: intl.formatMessage({ id: 'policyManage.form.titleZhRequired' }),
},
]}
> >
<Input placeholder={intl.formatMessage({ id: 'policyManage.form.titleZhPlaceholder' })} /> <Input
placeholder={intl.formatMessage({ id: 'policyManage.form.titleZhPlaceholder' })}
/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="contentZh" name="contentZh"
valuePropName="value"
label={intl.formatMessage({ id: 'policyManage.form.contentZh' })} label={intl.formatMessage({ id: 'policyManage.form.contentZh' })}
rules={[{ required: true, message: intl.formatMessage({ id: 'policyManage.form.contentZhRequired' }) }]} rules={[
{
required: true,
message: intl.formatMessage({ id: 'policyManage.form.contentZhRequired' }),
},
]}
> >
<WangEditor <WangEditor
key={`contentZh-${id || 'new'}`}
language="zh-CN" language="zh-CN"
height="300px" height="300px"
placeholder={intl.formatMessage({ id: 'policyManage.form.contentZhPlaceholder' })} placeholder={intl.formatMessage({ id: 'policyManage.form.contentZhPlaceholder' })}
/> />
</Form.Item> </Form.Item>
</TabPane> </TabPane>
<TabPane tab={intl.formatMessage({ id: 'policyManage.form.englishTab' })} key="en" forceRender={true}> <TabPane
tab={intl.formatMessage({ id: 'policyManage.form.englishTab' })}
key="en"
forceRender={true}
>
<Form.Item <Form.Item
name="titleEn" name="titleEn"
label={intl.formatMessage({ id: 'policyManage.form.titleEn' })} label={intl.formatMessage({ id: 'policyManage.form.titleEn' })}
rules={[{ required: true, message: intl.formatMessage({ id: 'policyManage.form.titleEnRequired' }) }]} rules={[
{
required: true,
message: intl.formatMessage({ id: 'policyManage.form.titleEnRequired' }),
},
]}
> >
<Input placeholder={intl.formatMessage({ id: 'policyManage.form.titleEnPlaceholder' })} /> <Input
placeholder={intl.formatMessage({ id: 'policyManage.form.titleEnPlaceholder' })}
/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="contentEn" name="contentEn"
valuePropName="value"
label={intl.formatMessage({ id: 'policyManage.form.contentEn' })} label={intl.formatMessage({ id: 'policyManage.form.contentEn' })}
rules={[{ required: true, message: intl.formatMessage({ id: 'policyManage.form.contentEnRequired' }) }]} rules={[
{
required: true,
message: intl.formatMessage({ id: 'policyManage.form.contentEnRequired' }),
},
]}
> >
<WangEditor <WangEditor
language="en" language="en"
key={`contentEn-${id || 'new'}`}
height="300px" height="300px"
placeholder={intl.formatMessage({ id: 'policyManage.form.contentEnPlaceholder' })} placeholder={intl.formatMessage({ id: 'policyManage.form.contentEnPlaceholder' })}
/> />

View File

@ -479,6 +479,7 @@ const PolicyManage: React.FC = () => {
onCancel={handleModalCancel} onCancel={handleModalCancel}
width={uiconfig.Modal.width} width={uiconfig.Modal.width}
maskClosable={false} maskClosable={false}
forceRender
destroyOnClose destroyOnClose
footer={ footer={
isViewMode isViewMode