UNPKG

mr-component

Version:
524 lines (459 loc) 17.8 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 组件测试</title> <style> body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif; margin: 0; padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; } .container { max-width: 800px; margin: 0 auto; background: white; border-radius: 16px; padding: 30px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); } .header { text-align: center; margin-bottom: 40px; } .header h1 { color: #333; margin: 0 0 10px 0; font-size: 28px; font-weight: 600; } .header p { color: #666; margin: 0; font-size: 16px; } .section { margin-bottom: 40px; padding: 20px; border-radius: 12px; border: 1px solid #e0e0e0; } .section h2 { margin: 0 0 20px 0; color: #333; font-size: 20px; font-weight: 600; display: flex; align-items: center; gap: 8px; } .section-payment { border-left: 4px solid #ff9800; } .section-mobile { border-left: 4px solid #2196f3; } .section-search { border-left: 4px solid #4caf50; } .section-basic { border-left: 4px solid #9c27b0; } .demo-row { margin-bottom: 20px; padding: 16px; background: #f8f9fa; border-radius: 8px; } .demo-row h3 { margin: 0 0 12px 0; color: #555; font-size: 14px; font-weight: 500; } .demo-values { margin-top: 12px; padding: 8px 12px; background: #e3f2fd; border-radius: 6px; border-left: 3px solid #2196f3; font-family: 'Monaco', 'Menlo', monospace; font-size: 12px; color: #1976d2; } .demo-values strong { color: #0d47a1; } .mr-input { margin-bottom: 16px; } /* 响应式设计 */ @media (max-width: 768px) { .container { margin: 0; border-radius: 0; min-height: 100vh; box-sizing: border-box; } body { padding: 0; background: white; } } </style> </head> <body> <div class="container"> <div class="header"> <h1>📝 MrInput 组件测试</h1> <p>支付场景专用输入框组件,包含金额输入、手机号输入、搜索输入等业务变体</p> </div> <!-- 支付金额输入测试 --> <div class="section section-payment"> <h2>💰 支付金额输入 (payment-amount)</h2> <div class="demo-row"> <h3>标准金额输入</h3> <div id="payment-amount-basic"></div> <div class="demo-values" id="payment-amount-basic-values"> <strong>原始值:</strong> '' | <strong>格式化值:</strong> '' </div> </div> <div class="demo-row"> <h3>大号金额输入 (H4字体)</h3> <div id="payment-amount-large"></div> <div class="demo-values" id="payment-amount-large-values"> <strong>原始值:</strong> '' | <strong>格式化值:</strong> '' </div> </div> <div class="demo-row"> <h3>美元金额输入</h3> <div id="payment-amount-dollar"></div> <div class="demo-values" id="payment-amount-dollar-values"> <strong>原始值:</strong> '' | <strong>格式化值:</strong> '' </div> </div> </div> <!-- 手机号输入测试 --> <div class="section section-mobile"> <h2>📱 手机号输入 (mobile-number)</h2> <div class="demo-row"> <h3>标准手机号输入</h3> <div id="mobile-number-basic"></div> <div class="demo-values" id="mobile-number-basic-values"> <strong>原始值:</strong> '' | <strong>格式化值:</strong> '' </div> </div> <div class="demo-row"> <h3>带标签的手机号输入</h3> <div id="mobile-number-labeled"></div> <div class="demo-values" id="mobile-number-labeled-values"> <strong>原始值:</strong> '' | <strong>格式化值:</strong> '' </div> </div> <div class="demo-row"> <h3>使用横线分隔符</h3> <div id="mobile-number-dash"></div> <div class="demo-values" id="mobile-number-dash-values"> <strong>原始值:</strong> '' | <strong>格式化值:</strong> '' </div> </div> </div> <!-- 搜索输入测试 --> <div class="section section-search"> <h2>🔍 搜索输入 (search-input)</h2> <div class="demo-row"> <h3>标准搜索输入</h3> <div id="search-input-basic"></div> <div class="demo-values" id="search-input-basic-values"> <strong>搜索值:</strong> '' | <strong>搜索结果:</strong> 未搜索 </div> </div> <div class="demo-row"> <h3>自定义搜索提示</h3> <div id="search-input-custom"></div> <div class="demo-values" id="search-input-custom-values"> <strong>搜索值:</strong> '' | <strong>搜索结果:</strong> 未搜索 </div> </div> </div> <!-- 基础功能测试 --> <div class="section section-basic"> <h2>⚙️ 基础功能测试</h2> <div class="demo-row"> <h3>不同字体大小</h3> <div id="basic-sizes"></div> </div> <div class="demo-row"> <h3>状态测试</h3> <div id="basic-states"></div> </div> <div class="demo-row"> <h3>验证功能</h3> <div id="basic-validation"></div> </div> </div> </div> <!-- React和相关依赖 --> <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script> <!-- 引入构建后的组件库 --> <script src="../lib/index.js"></script> <!-- 样式文件 --> <link rel="stylesheet" href="../lib/index.css" /> <script type="text/babel"> const { useState, useCallback } = React; const { MrInput } = window.MrComponent; // 支付金额输入演示 function PaymentAmountDemo() { const [basicValue, setBasicValue] = useState(''); const [basicFormatted, setBasicFormatted] = useState(''); const [largeValue, setLargeValue] = useState(''); const [largeFormatted, setLargeFormatted] = useState(''); const [dollarValue, setDollarValue] = useState(''); const [dollarFormatted, setDollarFormatted] = useState(''); return ( <> {/* 标准金额输入 */} <MrInput variant="payment-amount" placeholder="请输入金额" fontSize="h5" onChange={(raw, formatted) => { setBasicValue(raw); setBasicFormatted(formatted); document.getElementById( 'payment-amount-basic-values', ).innerHTML = `<strong>原始值:</strong> '${raw}' | <strong>格式化值:</strong> '${formatted}'`; }} /> {/* 大号金额输入 */} <MrInput variant="payment-amount" placeholder="请输入金额" fontSize="h4" onChange={(raw, formatted) => { setLargeValue(raw); setLargeFormatted(formatted); document.getElementById( 'payment-amount-large-values', ).innerHTML = `<strong>原始值:</strong> '${raw}' | <strong>格式化值:</strong> '${formatted}'`; }} /> {/* 美元金额输入 */} <MrInput variant="payment-amount" placeholder="请输入金额" fontSize="h5" currency="$" onChange={(raw, formatted) => { setDollarValue(raw); setDollarFormatted(formatted); document.getElementById( 'payment-amount-dollar-values', ).innerHTML = `<strong>原始值:</strong> '${raw}' | <strong>格式化值:</strong> '${formatted}'`; }} /> </> ); } // 手机号输入演示 function MobileNumberDemo() { const [basicValue, setBasicValue] = useState(''); const [basicFormatted, setBasicFormatted] = useState(''); const [labeledValue, setLabeledValue] = useState(''); const [labeledFormatted, setLabeledFormatted] = useState(''); const [dashValue, setDashValue] = useState(''); const [dashFormatted, setDashFormatted] = useState(''); return ( <> {/* 标准手机号输入 */} <MrInput variant="mobile-number" placeholder="请输入手机号" fontSize="h5" onChange={(raw, formatted) => { setBasicValue(raw); setBasicFormatted(formatted); document.getElementById( 'mobile-number-basic-values', ).innerHTML = `<strong>原始值:</strong> '${raw}' | <strong>格式化值:</strong> '${formatted}'`; }} /> {/* 带标签的手机号输入 */} <MrInput variant="mobile-number" label="联系电话" placeholder="请输入手机号" fontSize="h5" required onChange={(raw, formatted) => { setLabeledValue(raw); setLabeledFormatted(formatted); document.getElementById( 'mobile-number-labeled-values', ).innerHTML = `<strong>原始值:</strong> '${raw}' | <strong>格式化值:</strong> '${formatted}'`; }} /> {/* 使用横线分隔符 */} <MrInput variant="mobile-number" placeholder="请输入手机号" fontSize="h5" mobileSeparator="-" onChange={(raw, formatted) => { setDashValue(raw); setDashFormatted(formatted); document.getElementById( 'mobile-number-dash-values', ).innerHTML = `<strong>原始值:</strong> '${raw}' | <strong>格式化值:</strong> '${formatted}'`; }} /> </> ); } // 搜索输入演示 function SearchInputDemo() { const [basicValue, setBasicValue] = useState(''); const [basicResult, setBasicResult] = useState('未搜索'); const [customValue, setCustomValue] = useState(''); const [customResult, setCustomResult] = useState('未搜索'); return ( <> {/* 标准搜索输入 */} <MrInput variant="search-input" fontSize="h5" onChange={(value) => { setBasicValue(value); document.getElementById( 'search-input-basic-values', ).innerHTML = `<strong>搜索值:</strong> '${value}' | <strong>搜索结果:</strong> ${basicResult}`; }} onSearch={(value) => { const result = `搜索"${value}"的结果`; setBasicResult(result); document.getElementById( 'search-input-basic-values', ).innerHTML = `<strong>搜索值:</strong> '${value}' | <strong>搜索结果:</strong> ${result}`; }} /> {/* 自定义搜索提示 */} <MrInput variant="search-input" searchPlaceholder="搜索商品、店铺、品牌" fontSize="h5" onChange={(value) => { setCustomValue(value); document.getElementById( 'search-input-custom-values', ).innerHTML = `<strong>搜索值:</strong> '${value}' | <strong>搜索结果:</strong> ${customResult}`; }} onSearch={(value) => { const result = `找到关于"${value}"的商品`; setCustomResult(result); document.getElementById( 'search-input-custom-values', ).innerHTML = `<strong>搜索值:</strong> '${value}' | <strong>搜索结果:</strong> ${result}`; }} /> </> ); } // 基础功能演示 function BasicFeaturesDemo() { return ( <> {/* 不同字体大小 */} <div style={{ marginBottom: '20px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}> H4 大号输入框 </h4> <MrInput fontSize="h4" placeholder="H4 字体大小" /> </div> <div style={{ marginBottom: '20px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}> H5 标准输入框 </h4> <MrInput fontSize="h5" placeholder="H5 字体大小" /> </div> <div style={{ marginBottom: '20px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}> H6 小号输入框 </h4> <MrInput fontSize="h6" placeholder="H6 字体大小" /> </div> <div style={{ marginBottom: '20px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}> H7 迷你输入框 </h4> <MrInput fontSize="h7" placeholder="H7 字体大小" /> </div> </> ); } // 状态测试演示 function StateTestDemo() { return ( <> <div style={{ marginBottom: '16px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}>正常状态</h4> <MrInput placeholder="正常状态" /> </div> <div style={{ marginBottom: '16px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}>禁用状态</h4> <MrInput placeholder="禁用状态" disabled value="已禁用的输入框" /> </div> <div style={{ marginBottom: '16px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}>只读状态</h4> <MrInput placeholder="只读状态" readOnly value="只读的输入框内容" /> </div> <div style={{ marginBottom: '16px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}>错误状态</h4> <MrInput placeholder="错误状态" error errorMessage="输入格式不正确" /> </div> </> ); } // 验证功能演示 function ValidationDemo() { return ( <> <div style={{ marginBottom: '16px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}>必填字段</h4> <MrInput label="用户名" placeholder="请输入用户名" required /> </div> <div style={{ marginBottom: '16px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}>字数限制</h4> <MrInput placeholder="最多输入20个字符" maxLength={20} showWordLimit /> </div> <div style={{ marginBottom: '16px' }}> <h4 style={{ margin: '0 0 8px 0', color: '#666', fontSize: '12px' }}>可清除</h4> <MrInput placeholder="支持一键清除内容" clearable defaultValue="可以清除的内容" /> </div> </> ); } // 渲染所有演示 ReactDOM.render(<PaymentAmountDemo />, document.getElementById('payment-amount-basic')); ReactDOM.render(<PaymentAmountDemo />, document.getElementById('payment-amount-large')); ReactDOM.render(<PaymentAmountDemo />, document.getElementById('payment-amount-dollar')); ReactDOM.render(<MobileNumberDemo />, document.getElementById('mobile-number-basic')); ReactDOM.render(<MobileNumberDemo />, document.getElementById('mobile-number-labeled')); ReactDOM.render(<MobileNumberDemo />, document.getElementById('mobile-number-dash')); ReactDOM.render(<SearchInputDemo />, document.getElementById('search-input-basic')); ReactDOM.render(<SearchInputDemo />, document.getElementById('search-input-custom')); ReactDOM.render(<BasicFeaturesDemo />, document.getElementById('basic-sizes')); ReactDOM.render(<StateTestDemo />, document.getElementById('basic-states')); ReactDOM.render(<ValidationDemo />, document.getElementById('basic-validation')); </script> </body> </html>