List 列表
单个连续模块垂直排列,显示当前的内容、状态和可进行的操作。eg:联系人列表。规则
一般由主要信息、主要操作、次要信息、次要操作组成。
主要信息和主要操作放在列表的左边,次要信息和次要操作放在列表的右边。
代码演示
列表项类表单组件大集合(rc-form的基础用法请查看源码)
表单集合. (rc-form 文档,更多用法请详细阅读此文档)
基本用法. (rc-form 文档)
import { List, InputItem, Switch, Stepper, Slider, Radio, TextareaItem, WingBlank, WhiteSpace, Button } from 'antd-mobile';
import { createForm } from 'rc-form';
let BasicInput = React.createClass({
getInitialState() {
return {
disabled: false,
value: 1,
};
},
handleChange(e) {
if (e.target.checked) {
this.setState({
value: 1,
});
}
},
handleChange2(e) {
if (e.target.checked) {
this.setState({
value: 2,
});
}
},
onSubmit() {
this.props.form.validateFields({ force: true }, (error, values) => {
if (!error) {
const formValue = this.props.form.getFieldsValue();
console.log(values);
console.log(formValue);
} else {
alert('校验失败');
}
});
},
onReset() {
this.props.form.resetFields();
alert('重制完成');
},
validateAccount(rule, value, callback) {
if (value && value.length > 4) {
callback();
} else {
callback(new Error('帐号至少4个字符'));
}
},
render() {
const { getFieldProps, getFieldError } = this.props.form;
return (<div>
<List
title="表单输入项"
footer={getFieldError('account') && getFieldError('account').join(',')}
>
<InputItem
{...getFieldProps('account', {
initialValue: '小蚂蚁',
rules: [
{ required: true, message: '请输入帐号' },
{ validator: this.validateAccount },
],
})}
clear
error={!!getFieldError('account')}
onErrorClick={() => {
alert(getFieldError('account').join('、'));
}}
>帐号</InputItem>
<InputItem
{...getFieldProps('password')}
clear
placeholder="请输入密码"
type="password"
>密码</InputItem>
<InputItem
{...getFieldProps('input1', {
initialValue: '1245',
})}
clear
error
placeholder="校验样式"
type="password"
>密码</InputItem>
</List>
<List
title="表单展示项"
>
<List.Item
thumb="https://zos.alipayobjects.com/rmsportal/dNuvNrtqUztHCwM.png"
arrow="horizontal"
>我的钱包</List.Item>
<List.Item
thumb="https://zos.alipayobjects.com/rmsportal/UmbJMbWOejVOpxe.png"
arrow="horizontal"
>我的花销占比</List.Item>
</List>
<List
title="表单控件"
>
<List.Item
extra={<Switch
{...getFieldProps('1', {
initialValue: true,
valuePropName: 'checked',
})}
/>}
>使用 Ant Desgin Component</List.Item>
<List.Item>
<Slider range defaultValue={[20, 50]} />
</List.Item>
<List.Item
extra={<Stepper showNumber size="small" max={10} min={1} defaultValue={20} onChange={() => {}} />}
>预定人数</List.Item>
</List>
<List>
<TextareaItem
{...getFieldProps('note7', {
initialValue: '如果你有什么建议意见,欢迎你来吐槽',
})}
labelNumber={4}
name="yyy"
rows={5}
placeholder="计数功能"
clear
count={100}
onBlur={() => { console.log('onBlur'); }}
onFocus={(e) => { console.log('onFocus'); console.log(e); }}
/>
</List>
<List
title="列表单选"
>
<Radio.RadioItem
checked={this.state.value === 1}
onChange={this.handleChange}
disabled={this.state.disabled}
>
选项一
</Radio.RadioItem>
<Radio.RadioItem
checked={this.state.value === 2}
onChange={this.handleChange2}
disabled={this.state.disabled}
>
选项二
</Radio.RadioItem>
<Radio.RadioItem
checked
onChange={this.handleChange}
disabled
>
选项三
</Radio.RadioItem>
<Radio.RadioItem
checked={false}
onChange={this.handleChange}
disabled
>
选项四
</Radio.RadioItem>
</List>
<WhiteSpace />
<WingBlank size="lg">
<Button type="primary" onClick={this.onSubmit}>提交验证</Button>
<WhiteSpace />
<Button onClick={this.onReset}>重置</Button>
</WingBlank>
<WhiteSpace />
<WhiteSpace />
</div>);
},
});
BasicInput = createForm()(BasicInput);
ReactDOM.render(<BasicInput />, mountNode);
import { List } from 'antd-mobile';
import { createForm } from 'rc-form';
let ListExample = React.createClass({
render() {
return (<form>
<List
title="我是华丽丽的列表头部"
footer="我是列表尾部"
>
<List.Item>没有设置onClick则点击无反馈,文字超长则隐藏</List.Item>
<List.Item wrap>文字超长折行文字超长折行文字超长折行文字超长折行文字超长折行文字超长折行</List.Item>
<List.Item
onClick={() => {}}
extra={undefined}
>标题文字</List.Item>
<List.Item
extra="内容内容"
onClick={() => {}}
arrow="horizontal"
>标题文字</List.Item>
</List>
<List
title="下拉框"
>
<List.Item
extra={<select style={{ direction: 'rtl' }} defaultValue="2">
<option value="1">选项1</option>
<option value="2">选项2</option>
<option value="3" disabled>选项3不可选</option>
</select>}
arrow="horizontal"
>下拉框</List.Item>
<List.Item
arrow="horizontal"
>
<select defaultValue="3">
<option value="1">选项1</option>
<option value="2" disabled>选项2不可选</option>
<option value="3">选项3</option>
</select>
</List.Item>
</List>
<List
title="带缩略图"
>
<List.Item
thumb="https://zos.alipayobjects.com/rmsportal/zotStpFiYpNtZNl.png"
arrow="horizontal"
onClick={() => {}}
>thumb</List.Item>
<List.Item
thumb="https://zos.alipayobjects.com/rmsportal/zotStpFiYpNtZNl.png"
>thumb</List.Item>
<List.Item
icon=""
extra={<img src="https://zos.alipayobjects.com/rmsportal/zotStpFiYpNtZNl.png" width="28" height="28" />}
arrow="horizontal"
>extra为img标签</List.Item>
</List>
</form>);
},
});
ListExample = createForm()(ListExample);
ReactDOM.render(<ListExample />, mountNode);
单行列表
/** hack for antd responsive conflict */
@media only screen and (max-width: 767px) and (min-width: 320px) {
#list {
display: block;
}
}
双行列表
import { List } from 'antd-mobile';
window.clickItem = (e) => {
console.log(e);
console.log(this);
console.log(ReactDOM.findDOMNode(this));
console.log($(ReactDOM.findDOMNode(this)).find('.am-list-extra'));
$(ReactDOM.findDOMNode(this)).find('.am-list-extra').css('color', 'red');
};
window.openurl = (e) => {
e.preventDefault();
let target = e.target;
if (!$(target).hasClass('am-list-item')) {
target = $(target).parents('.am-list-item')[0];
}
window.location.href = target.href;
};
ReactDOM.render(
<div>
<List
title="箭头方向"
>
<List.Item extra="horizontal,箭头向右" arrow="horizontal" onClick={() => {}}>标题文字</List.Item>
<List.Item extra="down,箭头向下" arrow="down" onClick={() => {}}>标题文字</List.Item>
<List.Item extra="up,箭头向上" arrow="up" onClick={() => {}}>标题文字</List.Item>
<List.Item
extra={<div>内容内容<List.Item.Brief>辅助文字内容</List.Item.Brief></div>}
arrow="horizontal"
onClick={() => {}}
multipleLine
>标题文字<List.Item.Brief>辅助文字内容</List.Item.Brief></List.Item>
<List.Item
extra={<div>内容内容<List.Item.Brief>辅助文字内容</List.Item.Brief></div>}
arrow="down"
onClick={() => {}}
multipleLine
>标题文字<List.Item.Brief>辅助文字内容</List.Item.Brief></List.Item>
<List.Item
extra={<div>内容内容<List.Item.Brief>辅助文字内容</List.Item.Brief></div>}
arrow="up"
error
onClick={() => {}}
multipleLine
>标题文字<List.Item.Brief>辅助文字内容</List.Item.Brief></List.Item>
<List.Item
extra="empty,有箭头坑位"
arrow="empty"
onClick={() => {}}
multipleLine
>内容内容</List.Item>
<List.Item
extra="校验报错"
error
onClick={() => {}}
>内容内容</List.Item>
</List>
</div>
, mountNode);
一个业务上使用的示例。
import { List, Button } from 'antd-mobile';
const Brief = List.Item.Brief;
ReactDOM.render(
<div>
<List title="对齐">
<List.Item
extra={<div>内容内容<Brief>辅助文字内容</Brief><Brief>辅助文字内容</Brief></div>}
arrow="horizontal"
onClick={() => {}}
multipleLine
>垂直居中对齐</List.Item>
<List.Item
extra="内容内容"
arrow="horizontal"
onClick={() => {}}
multipleLine
><div>垂直居中对齐<Brief>辅助文字内容</Brief><Brief>辅助文字内容</Brief></div></List.Item>
<List.Item
extra={<div>内容内容<Brief>辅助文字内容</Brief><Brief>辅助文字内容</Brief></div>}
arrow="horizontal"
align="top"
onClick={() => {}}
multipleLine
>顶部对齐</List.Item>
<List.Item
extra="内容内容"
arrow="horizontal"
align="top"
onClick={() => {}}
multipleLine
><div>顶部对齐<Brief>辅助文字内容</Brief></div></List.Item>
<List.Item
extra={<div>内容内容<Brief>辅助文字内容</Brief></div>}
arrow="horizontal"
align="bottom"
onClick={() => {}}
multipleLine
>底部对齐</List.Item>
<List.Item
extra="内容内容"
arrow="horizontal"
align="bottom"
onClick={() => {}}
multipleLine
><div>底部对齐<Brief>辅助文字内容</Brief></div></List.Item>
<List.Item
extra={<Button
size="small"
inline
onClick={() => alert(111)}
>按钮</Button>}
multipleLine
><div><div>区域经理</div><Brief>可进行收款、退款、折扣管理、查看数据等操作</Brief></div></List.Item>
</List>
</div>
, mountNode);
import { List } from 'antd-mobile';
ReactDOM.render(
<div>
<List>
<List.Item
extra="鹿港小镇"
arrow="horizontal"
onClick={() => {}}
>所属门店</List.Item>
<List.Item
extra="张三"
arrow="empty"
onClick={() => {}}
>员工姓名</List.Item>
<List.Item
extra="收银员"
arrow="empty"
onClick={() => {}}
>员工角色</List.Item>
<List.Item
extra="13838383756"
arrow="empty"
onClick={() => {}}
>员工手机</List.Item>
<List.Item
extra="只可退自己的"
arrow="empty"
onClick={() => {}}
>退款权限</List.Item>
<List.Item
extra="其他权限"
arrow="horizontal"
onClick={() => {}}
>文本信息</List.Item>
<List.Item
extra={<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAAm0lEQVR4Ae2Whw0DMQwD5Q24gfbfRTslaPlGCGb6vyAe2tdzty1uArAlyz2RMgJLoggsSTUBfUwCSkD49jKCFnhgYegCaZgSIAGlokCHBDk1BR6YspMteHIfRqWbhMc714Y/aMF/Bdgw5mJh5HgmU2u2qITatEAQCEvCe53cp+v3T9ct0E92HH01bcGlBIEVRfDWMGUBU0aQ04I7BEwkp1QhR1sAAAAASUVORK5CYII=" />}
arrow="horizontal"
onClick={() => {}}
>员工二维码</List.Item>
<List.Item
extra={<div>zhifubao@alipay.com#<List.Item.Brief>001</List.Item.Brief></div>}
arrow="horizontal"
onClick={() => {}}
multipleLine
>垂直居中对齐</List.Item>
<List.Item
extra={<div>zhifubao@alipay.com#<List.Item.Brief>001</List.Item.Brief></div>}
arrow="horizontal"
align="top"
onClick={() => {}}
multipleLine
>顶部对齐</List.Item>
<List.Item
extra={<div>zhifubao@alipay.com#<List.Item.Brief>001</List.Item.Brief></div>}
arrow="horizontal"
align="bottom"
onClick={() => {}}
multipleLine
>底部对齐</List.Item>
<List.Item
extra={<div>zhifubao@alipay.com#<List.Item.Brief>001</List.Item.Brief></div>}
arrow="horizontal"
align="top"
onClick={() => {}}
multipleLine
wrap
>文字超长折行文字超长折行</List.Item>
</List>
</div>
, mountNode);
API
List
成员 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | list title | ReactNode | 无 |
footer | list footer | ReactNode | 无 |
List.Item
成员 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
thumb | 缩略图 | imgsrc | 无 | |
extra | 右边内容 | String/HTML | 无 | |
arrow | 箭头方向(右,上,下),如果是empty ,则存在对应的dom,但是不显示 | String | horizontal 、up 、down 、empty 、无 | 无 |
align | Flex 子元素垂直对齐 | String | top middle bottom | middle |
onClick | 点击事件的回调函数 | Function | 无 | |
error | 报错样式,右侧文字颜色变成橙色 | Boolean | true 、false | false |
multipleLine | 多行 | Boolean | true 、false | false |
wrap | 是否换行,默认情况下,文字超长会被隐藏, | Boolean | true 、false | false |