修复wangeditor 集成报错
This commit is contained in:
@ -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,
|
||||||
|
@ -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) => {
|
||||||
|
@ -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' })}
|
||||||
/>
|
/>
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user