UNPKG

mr-component

Version:
312 lines (268 loc) 9.43 kB
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>MrInput onChange 修复验证</title> <!-- 加载React 17 --> <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> <!-- 加载lowcode构建文件 --> <script src="../build/lowcode/view.js"></script> <link rel="stylesheet" href="../build/lowcode/view.css" /> <style> body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; margin: 0; padding: 20px; background: #f8f9fa; } .container { max-width: 800px; margin: 0 auto; background: white; padding: 40px; border-radius: 12px; box-shadow: 0 2px 20px rgba(0, 0, 0, 0.1); } .test-group { margin-bottom: 30px; padding: 25px; border: 2px solid #e9ecef; border-radius: 8px; background: #f8f9fa; } .test-group h3 { margin: 0 0 15px 0; color: #495057; font-size: 16px; font-weight: 600; } .input-wrapper { margin-bottom: 15px; } .input-wrapper label { display: block; margin-bottom: 8px; font-weight: 500; color: #6c757d; font-size: 14px; } .result { margin-top: 10px; padding: 10px 15px; background: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px; font-family: 'Monaco', 'Menlo', monospace; font-size: 13px; color: #0c5460; } .status { text-align: center; padding: 20px; border-radius: 8px; margin-bottom: 20px; font-weight: 500; } .status.success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .status.error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } .events-log { max-height: 200px; overflow-y: auto; background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 10px; font-family: monospace; font-size: 12px; } .event-item { padding: 4px 0; border-bottom: 1px solid #e9ecef; } .event-time { color: #6c757d; margin-right: 10px; } .event-action { color: #007bff; font-weight: 600; } .event-value { color: #28a745; } </style> </head> <body> <div class="container"> <h1>🔧 MrInput onChange 事件修复验证</h1> <div id="status-display"></div> <div id="app"></div> </div> <script type="text/babel"> const { useState, useEffect } = React; function showStatus(message, type = 'success') { const statusEl = document.getElementById('status-display'); statusEl.innerHTML = `<div class="status ${type}">${message}</div>`; } function OnChangeTestApp() { const [inputValues, setInputValues] = useState({ text: '', number: '', password: '', email: '', }); const [events, setEvents] = useState([]); // 检查组件加载状态 useEffect(() => { if (typeof VantComponents === 'undefined' || !VantComponents.MrInput) { showStatus('❌ 错误:MrInput 组件未正确加载!请检查构建文件。', 'error'); return; } showStatus('✅ 成功:MrInput 组件已加载,开始测试 onChange 事件...', 'success'); }, []); // 记录事件 const logEvent = (type, field, value) => { const timestamp = new Date().toLocaleTimeString(); const newEvent = { id: Date.now(), timestamp, type, field, value: String(value), }; setEvents((prev) => [newEvent, ...prev.slice(0, 19)]); // 保留最近20条 }; // 处理输入变化 const handleInputChange = (field) => (value) => { console.log(`🔥 onChange 触发!字段: ${field}, 值: "${value}"`); // 更新输入值 setInputValues((prev) => ({ ...prev, [field]: value, })); // 记录事件 logEvent('onChange', field, value); // 更新状态显示 showStatus(`✅ onChange 事件成功触发!字段: ${field}, 值: "${value}"`, 'success'); }; if (typeof VantComponents === 'undefined' || !VantComponents.MrInput) { return ( <div className="status error"> ❌ 错误:VantComponents.MrInput 组件未找到! <br /> 请确保 lowcode 构建文件正确加载。 </div> ); } const { MrInput } = VantComponents; return ( <div> <div className="test-group"> <h3>📝 基础输入测试</h3> <div className="input-wrapper"> <label>文本输入框(type="text"):</label> <MrInput type="text" placeholder="请输入文本,测试onChange事件" value={inputValues.text} onChange={handleInputChange('text')} /> <div className="result">当前值: "{inputValues.text}"</div> </div> <div className="input-wrapper"> <label>数字输入框(type="number"):</label> <MrInput type="number" placeholder="请输入数字,测试onChange事件" value={inputValues.number} onChange={handleInputChange('number')} /> <div className="result">当前值: "{inputValues.number}"</div> </div> </div> <div className="test-group"> <h3>🔐 特殊类型测试</h3> <div className="input-wrapper"> <label>密码输入框(type="password"):</label> <MrInput type="password" placeholder="请输入密码,测试onChange事件" value={inputValues.password} onChange={handleInputChange('password')} /> <div className="result">当前值: "{inputValues.password}"</div> </div> <div className="input-wrapper"> <label>邮箱输入框(type="email"):</label> <MrInput type="email" placeholder="请输入邮箱,测试onChange事件" value={inputValues.email} onChange={handleInputChange('email')} /> <div className="result">当前值: "{inputValues.email}"</div> </div> </div> <div className="test-group"> <h3>🎨 主题样式测试</h3> <div className="input-wrapper"> <label>主色蓝色主题(theme="primary"):</label> <MrInput type="text" theme="primary" placeholder="蓝色主题,测试onChange事件" onChange={(value) => { console.log('主色主题输入:', value); logEvent('onChange', 'primary-theme', value); }} /> </div> <div className="input-wrapper"> <label>警告橙色主题(theme="warning"):</label> <MrInput type="text" theme="warning" placeholder="橙色主题,测试onChange事件" onChange={(value) => { console.log('警告主题输入:', value); logEvent('onChange', 'warning-theme', value); }} /> </div> </div> {events.length > 0 && ( <div className="test-group"> <h3>📊 事件记录(最近20条)</h3> <div className="events-log"> {events.map((event) => ( <div key={event.id} className="event-item"> <span className="event-time">{event.timestamp}</span> <span className="event-action">{event.type}</span> <span></span> <span className="event-field">{event.field}</span> <span> = </span> <span className="event-value">"{event.value}"</span> </div> ))} </div> </div> )} </div> ); } // 渲染应用 ReactDOM.render(<OnChangeTestApp />, document.getElementById('app')); </script> </body> </html>