message

http://www.erp100.com/html/43/2743-2432.html

定义Message
系统Message Dictionary定义Message的优点在于:
1一次定义,多次引用;
2可定义参数,避免硬编码;
3可很好解决多语言环境下消息文本的转译问题。
应用开发员—应用产品—消息,进入如图9.1所示界面。
下图定义了一个名为DEMVC_SHIP_BEFORE_ORDER的Message。
Oracle建议Message Name采用大写字母加下划线的命名方式不要超过30个字符,Application就是引用Message的应用,Language即语言环境,输入Number值在显示的时候会添加APP-前缀,为空的话无前缀也会省略,Current Message Text就是要显示的文本了,带’&’的则说明该Message带参数,图中的Message就有&ORDERDATE和&SHIPDATE两个参数。可定义Name相同Language不同的消息,用作多语言环境下的文本转译。
定义Message信息时除了语法、语义上的注意事项外,还需遵循一些编码规范。比如说:定义的参数最好有特定的含义并且易于区分,尽量不要将一些仅表达语义的短语作为参数传入(因为Oracle在翻译Message的时候默认不会翻译参数,相当于这些参数都是硬编码的)。
 
显示消息
显示消息可以调用消息字典中定义的消息,也可以显示服务器上出错信息和消息堆栈中的信息,还可以显示程序代码生成的消息文本。
1调用消息字典消息
 步骤如下:
(1)FND_MESSAGE.SET_NAME设置MESSAGE_NAME和Application Short Name;
(2)2 FND_MESSAGE.SET_TOKEN设置MESSAGE参数,注意必要时对参数进行格式转换。
Eg:
IF (EVENT = 'WHEN-VALIDATE-ITEM') THEN
IF :ORDERS.DATE_SHIPPED IS NOT NULL THEN
 IF :ORDERS.DATE_SHIPPED < :ORDERS.DATE_ORDERED THEN  
   FND_MESSAGE.SET_NAME('DEM','DEMVC_SHIP_BEFORE_ORDER'); 
FND_MESSAGE.SET_TOKEN('ORDERDATE',APP_DATE.DATE_TO_CHARDATE
(:ORDERS.DATE_ORDERED),FALSE);
   FND_MESSAGE.SET_TOKEN('SHIPDATE',APP_DATE.DATE_TO_CHARDATE
(:ORDERS.DATE_SHIPPED),FALSE);
   FND_MESSAGE.ERROR;
 END IF;
 END IF;
END IF;
 
2 显示服务器上出错信息和消息堆栈中的信息
Eg1:
FND_MESSAGE.SET_NAME (’FND’,’FLEX_COMPILE_ERROR’);
FND_MESSAGE.SET_TOKEN (’PROCEDURE’,’My Procedure’);
APP_EXCEPTION.RAISE_EXCEPTION;
/* Retrieve an expected message from the server side,
then show it to the user */
FND_MESSAGE.RETRIEVE;
FND_MESSAGE.ERROR;
/* Then either raise FORM_TRIGGER_FAILURE, or exit
routine*/
 
Eg2:
/* Get translated string from message file */
declare
msg varchar2(2000);
begin
FND_MESSAGE.SET_NAME (’FND’,’A_2000_BYTE_MSG’);
msg := FND_MESSAGE.GET;
end;
/* We now have a translated value in the msg variable
for forms built–in or other function */
 
3显示程序代码生成的消息(这也是我们经常用到的)。
Example 1
FND_MESSAGE.SET_STRING (’系统发生了一个严重的错误’);
FND_MESSAGE.ERROR;
 
Example 2
IF (FND_MESSAGE.WARN) THEN
   WARNNING_FLAG :=‘Y’;
ELSE
   WARNNING_FLAG :=‘N’;
END IF ;
 
Example 3
FND_MESSAGE.SET_STRING (’Hello World’);
FND_MESSAGE.SHOW;
 
Example 4
FND_MESSAGE.SET_STRING (’我要显示在状态栏上’);
FND_MESSAGE.HINT;
FND_MESSAGE.ERASE; --清空Form状态栏信息
 
 
Example 5
FND_MESSAGE.SET_STRING('确认后记录将不可修改,是否确认?'); 
IF FND_MESSAGE.QUESTION('是',null,'否',1,3,'question') = 3 THEN
   :HEADER.INV_CONFIRM_FLAG := 'N';
ELSE
   DO_KEY('commit_form');
END IF ;
 
 
 
Example 6
FND_MESSAGE.DEBUG ('这是一条调试信息');
 
 
全部脚印 不留脚印 留下脚印:
<think>我们正在讨论AntDesign(antd)中的Message组件。Message组件用于显示全局的操作反馈信息,例如成功、失败、警告等提示。它是一个轻量级的反馈工具,通过调用函数式API来显示和隐藏消息。下面将详细介绍antdMessage组件的用法、常见问题以及最佳实践。###一、基本用法1.**引入Message组件**:```javascriptimport{message}from'antd';```2.**显示不同类型的消息**:-成功消息:`message.success(content,duration,onClose)`-错误消息:`message.error(content,duration,onClose)`-警告消息:`message.warning(content,duration,onClose)`-普通消息:`message.info(content,duration,onClose)`-加载中消息:`message.loading(content,duration,onClose)`示例:```javascriptmessage.success('操作成功!');```3.**参数说明**:-`content`:消息内容(字符串或React节点)-`duration`:自动关闭延时(秒),默认3秒,设为0则不自动关闭-`onClose`:关闭时触发的回调函数###二、高级用法1.**自定义消息样式**:-通过`className`和`style`属性自定义样式:```javascriptmessage.success({content:'操作成功!',className:'custom-message',style:{marginTop:'50px'},});```2.**手动关闭消息**:-调用函数会返回一个函数,用于手动关闭消息:```javascriptconstclose=message.loading('正在处理中...',0);//在合适的时候关闭close();```3.**连续显示消息**:-使用`then`链式调用确保消息顺序:```javascriptmessage.loading('正在处理中...',2.5).then(()=>message.success('处理完成',2.5));```4.**使用唯一键避免重复**:-通过指定`key`来避免同一消息重复显示:```javascriptmessage.success({content:'操作成功!',key:'updatable'});//更新同key的消息内容setTimeout(()=>{message.success({content:'已更新!',key:'updatable'});},1000);```###三、常见问题与解决方案1.**消息队列堆积**:-问题:快速触发多个消息时,消息会堆积在页面顶部。-解决:使用`maxCount`限制同时显示的消息数量(v4.5.0+):```javascript//在应用入口配置message.config({maxCount:3,});```2.**样式冲突**:-问题:自定义主题时,消息样式未生效。-解决:通过`config`方法设置全局样式前缀:```javascriptmessage.config({prefixCls:'your-custom-prefix',});```3.**国际化**:-问题:消息内容需要多语言支持。-解决:结合`i18n`库动态传入内容:```javascriptimport{i18n}from'./i18n';//假设的i18n实例message.success(i18n.t('operation.success'));```4.**在Hooks中的使用**:-问题:在函数组件中直接调用可能导致闭包问题。-解决:确保在事件处理中调用,而非渲染逻辑中:```jsxfunctionMyComponent(){consthandleClick=()=>{message.success('操作成功');};return<buttononClick={handleClick}>提交</button>;}```###四、最佳实践1.**封装消息工具**:```javascript//utils/message.jsimport{message}from'antd';exportconstshowSuccess=(text)=>{message.success(text);};exportconstshowError=(text)=>{message.error(text);};```2.**配合异步操作**:```javascriptconsthandleAsyncAction=async()=>{consthide=message.loading('正在提交...',0);try{awaitapi.submitData();hide();message.success('提交成功');}catch(error){hide();message.error('提交失败');}};```3.**在类组件中使用**:```javascriptclassMyComponentextendsReact.Component{showMessage=()=>{message.info('这是类组件中的消息');};render(){return<buttononClick={this.showMessage}>显示消息</button>;}}```###五、注意事项-**避免滥用**:消息应作为用户操作的即时反馈,不宜过度使用。-**无障碍支持**:antd消息默认具有`role="alert"`,符合无障碍标准。-**服务端渲染**:消息组件依赖DOM,在SSR中需确保只在客户端执行。---§§相关问题§§1.如何自定义antdMessage组件的动画效果?2.在ReactRouter路由切换时如何防止消息残留?3.如何为antdMessage组件编写单元测试?4.antdMessage与Notification组件的使用场景有何区别?</think>### Ant Design Message 组件使用指南 在 React 项目中,Ant Design 的 Message 组件是用于全局提示反馈的轻量级组件,常用于操作成功/失败通知、警告提示等场景。 #### 一、基础用法 ```jsx import { message } from 'antd'; // 显示不同类型消息 function showMessages() { message.success('操作成功!'); message.error('操作失败!'); message.warning('警告提示'); message.info('普通信息'); message.loading('加载中...'); } // 自定义配置 message.config({ top: 100, // 距离顶部位置 duration: 5, // 显示时长(秒) maxCount: 3 // 最大显示数量 }); ``` #### 二、高级功能 1. **手动关闭消息**: ```jsx const hide = message.loading('处理中...', 0); // 完成后关闭 setTimeout(hide, 2000); ``` 2. **更新现有消息**: ```jsx const key = 'updatable'; message.loading({ content: '正在保存...', key }); setTimeout(() => { message.success({ content: '保存成功!', key, duration: 2 }); }, 1000); ``` 3. **自定义样式**: ```jsx message.success({ content: '自定义样式消息', className: 'custom-message', style: { backgroundColor: '#f6ffed', border: '1px solid #b7eb8f' } }); ``` #### 三、常见问题解决方案 1. **消息堆叠问题**: ```jsx // 配置 maxCount 限制最大显示数量 message.config({ maxCount: 3 }); ``` 2. **路由切换时消息残留**: ```jsx // 在路由组件中使用 useEffect 清理 import { useEffect } from 'react'; import { message } from 'antd'; function MyComponent() { useEffect(() => { return () => message.destroy(); // 组件卸载时清除所有消息 }, []); } ``` 3. **多语言支持**: ```jsx import { message } from 'antd'; import i18n from './i18n'; // 国际化库 message.success(i18n.t('operation.success')); ``` 4. **Promise 流程控制**: ```jsx const handleSubmit = () => { message .loading('处理中...', 2.5) .then(() => message.success('处理完成', 2.5)) .catch(() => message.error('处理失败')); }; ``` #### 四、最佳实践 1. **封装工具函数**: ```jsx // utils/message.js import { message } from 'antd'; export const showSuccess = (text) => message.success(text || '操作成功'); export const showError = (error) => message.error(error.message || '操作失败'); ``` 2. **Hooks 集成**: ```jsx import { useCallback } from 'react'; import { message } from 'antd'; export function useMessage() { const showSuccess = useCallback((text) => { message.success(text); }, []); return { showSuccess }; } ``` 3. **TypeScript 类型支持**: ```tsx // 定义消息类型 type MessageType = 'success' | 'error' | 'info' | 'warning' | 'loading'; // 增强类型安全的调用函数 const showMessage = ( type: MessageType, content: string | React.ReactNode, duration?: number ) => { message[type](content, duration); }; ``` #### 五、注意事项 1. **避免在渲染逻辑中直接调用**:应在事件处理函数或 useEffect 中调用 2. **样式覆盖**:通过 `.ant-message` 类名自定义全局样式 3. **服务端渲染**:在 SSR 场景下需通过 `message.config` 禁用动态位置计算: ```jsx message.config({ getContainer: () => document.body }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值