custom 组件
custom 组件支持自定义渲染界面
除了基础的成员外,list 组件的实例还有如下成员:
items: object[]
组件结构
支持的原子组件
原子组件的样式请参考 react-native文档
text组件
其他属性见 react-native文档
const helloText = { type: 'text', style: { color: 'red', fontSize: 16, textAlign: 'center' }, // 原子组件的样式 text: 'hello world'}
input组件
其他属性见 native-base文档
const input = { type: 'input', label: '姓名(default)', defaultValue: '张三', style: { width: '100%' }, onChange(text) { console.log('changed ', text) }}
button组件
button 只是容器,需要包含 text 或者 icon 的item 其他属性见 native-base文档
const button = { type: 'button', style: { backgroundColor: 'green' }, items: [ { type: 'icon', source: $icon('face', 'black') }, { type: 'text', style: { color: '#fff' }, text: '点我' } ]}
switch组件
其他属性见 react-native文档
const switch = { type: 'switch', onChange(value) { console.log('switch changed ', value) }}
thumbnail组件
支持圆形或者方形
其他属性见 native-base文档
const thumb = { type: 'thumbnail', source: 'https://p0.meituan.net/moviemachine/58ee13be6dc60bf5e636cf915bbbaaa55787785.jpg@464w_644h_1e_1c'}
image组件
其他属性见 react-native文档
const image = { type: 'image', source: 'https://p0.meituan.net/moviemachine/58ee13be6dc60bf5e636cf915bbbaaa55787785.jpg@464w_644h_1e_1c'}
view组件 / custom组件
view是react-native的容器组件,custom组件可以嵌套,会被包裹在一层view组件中
其他属性见 react-native文档
const view = { type: 'view', style: { // height: 150, flex: 1, width: '100%', justifyContent: 'center', alignItems: 'center' }, items: [ { type: 'text', style: { color: 'red', fontSize: 16, textAlign: 'center' }, text: 'hello world' } ]}
scrollView组件
带有滚动条的容器组件,滚动轴方向的高度/宽度必须是确定的 其他属性见 react-native文档
const view = { type: 'scrollview', style: { height: 100, flex: 1, width: '100%', justifyContent: 'center', alignItems: 'center' }, items: [ { type: 'text', style: { color: 'red', fontSize: 16, textAlign: 'center' }, text: 'hello world' }, { type: 'text', style: { color: 'red', fontSize: 16, textAlign: 'center' }, text: 'hello world' }, { type: 'text', style: { color: 'red', fontSize: 16, textAlign: 'center' }, text: 'hello world' }, { type: 'text', style: { color: 'red', fontSize: 16, textAlign: 'center' }, text: 'hello world' } ]}
list组件
支持嵌套list组件
const list = { type: 'list', items: [ // label { title: '样式: label', style: 'category', itemStyle: { paddingBottom: 20, backgroundColor: 'red' } }, { title: 'Label 1', style: 'label' } ]}
video组件
const video = { type: 'video', url: { value: "", headers: [] }, // 对象形式的url // url: "", // 字符串形式的url // selectors: [],}
audio组件
const audio = { type: 'audio', url: { value: "", // headers: [] // 暂不支持 }, // 对象形式的url // url: "", // 字符串形式的url // onNext(){}, // onPrevious(){}, // hasNext: true, // hasPrevious: true,}
icon组件
icon列表见 react-native-vector-icons
可能会存在 部分icon错误的情况,建议多试试
const icon = { type: 'icon', source: $icon('star') + "?type=AntDesign&color=red"}
article组件
const article = { type: 'article', content: { text: "hello world!" }}
示例
const fs = require('fs')const path = require('path')module.exports = { type: 'custom', title: '自定义页面', actions: [ { id: 'update_menu', title: 'Update title', onClick: async function () { let newTitle = await $input.prompt({ title: 'Update title', hint: 'new title', value: this.title }) console.log('update_menu got newTitle', newTitle) this.title = newTitle } } ], async fetch() { return [ { type: 'view', style: { // height: 150, flex: 1, width: '100%', justifyContent: 'center', alignItems: 'center' }, items: [ { type: 'text', style: { color: 'red', fontSize: 16, textAlign: 'center' }, text: 'hello world' }, { type: 'button', style: { backgroundColor: 'green' }, items: [ { type: 'icon', source: $icon('face', 'black') }, { type: 'text', style: { color: '#fff' }, text: '点我' } ] }, { type: 'image', source: 'https://p0.meituan.net/moviemachine/58ee13be6dc60bf5e636cf915bbbaaa55787785.jpg@464w_644h_1e_1c', style: { width: 50, height: 50 } }, { type: 'view', style: { width: '100%', flexDirection: 'row', alignItems: 'center' }, items: [ { type: 'thumbnail', source: 'https://p0.meituan.net/moviemachine/58ee13be6dc60bf5e636cf915bbbaaa55787785.jpg@464w_644h_1e_1c' }, { type: 'text', text: '我是作者' } ] }, { type: 'view', style: { width: '100%', flexDirection: 'column', alignItems: 'center' }, items: [ { type: 'switch', onChange(value) { console.log('switch changed ', value) } }, { type: 'input', label: '姓名(default)', defaultValue: '张三', style: { width: '100%' }, onChange(text) { console.log('changed ', text) } }, { type: 'input', floatingLabel: true, label: '姓名(floatingLabel)', defaultValue: '张三', onChange(text) { console.log('changed ', text) } }, { type: 'input', inlineLabel: true, label: '姓名(inlineLabel)', defaultValue: '张三', onChange(text) { console.log('changed ', text) } }, { type: 'input', fixedLabel: true, label: '姓名(fixedLabel)', defaultValue: '张三', onChange(text) { console.log('changed ', text) } }, { type: 'input', stackedLabel: true, label: '姓名(stackedLabel)', defaultValue: '张三', onChange(text) { console.log('changed ', text) } }, { type: 'input', rounded: true, label: '姓名(rounded)', defaultValue: '张三', onChange(text) { console.log('changed ', text) } }, { type: 'input', regular: true, label: '姓名(regular)', defaultValue: '张三', onChange(text) { console.log('changed ', text) } }, { type: 'input', leftIcon: { source: $icon('face', 'black'), onClick() { alert('clicked leftIcon') } }, defaultValue: '14', onChange(text) { console.log('changed ', text) } }, { type: 'input', rightIcon: { source: $icon('face', 'green'), onClick() { alert('clicked leftIcon') } }, defaultValue: '15', onChange(text) { console.log('changed ', text) } }, { type: 'input', leftIcon: { source: $icon('face', 'red') }, rightIcon: { source: $icon('face', 'green') }, defaultValue: '16', onChange(text) { console.log('changed ', text) } } ] } ] }, { type: 'view', style: { height: 500 }, items: [ { type: 'list', items: [ // label { title: '样式: label', style: 'category', itemStyle: { paddingBottom: 20, backgroundColor: 'red' } }, { title: 'Label 1', style: 'label' }, { title: 'Label 2', style: 'label' }, { title: 'Label 3', style: 'label' }, { title: 'Label 4', style: 'label' }, // chips { title: '样式: chips', style: 'category' }, { title: 'Chips title', style: 'chips', actions: [ { title: 'Action 1' }, { title: 'Action 2' }, { title: 'Action 3' }, { title: 'Action 4' } ] }, // simple { title: '样式:simple', style: 'category' }, { title: 'Hello World!', style: 'simple' }, { title: 'Hello World!', style: 'simple', summary: '一个简单的样式' }, { title: 'Hello World!', style: 'simple', image: $icon('face', 'black'), summary: '一个简单的样式' }, // icon { title: '样式:icon', style: 'category' }, { title: 'icon', style: 'icon', image: $icon('face', 'red') }, { title: 'icon', style: 'icon', image: $icon('code') }, { title: 'icon', style: 'icon', image: $icon('build', 'green') }, // dashboard { title: '样式:dashboard', style: 'category' }, { style: 'dashboard', image: $icon('memory'), title: '内存使用', summary: '1024 MB', color: '#8B355E', textColor: 'white' }, { style: 'dashboard', image: $icon('battery_alert'), title: '电池使用', summary: '1024MB', color: '#81AF37', textColor: 'white' }, // vod { title: '样式:vod', style: 'category' }, { title: '冰雪奇缘2', style: 'vod', thumb: 'https://p0.meituan.net/moviemachine/58ee13be6dc60bf5e636cf915bbbaaa55787785.jpg@464w_644h_1e_1c', label: '喜剧,动画,冒险', summary: '为什么艾莎(伊迪娜·门泽尔 配音)天生就拥有神奇魔法?谜题的答案一直呼唤着她,也威胁着王国的安全。她将和安娜(克里斯汀·贝尔 配音)、克斯托夫(乔纳森·格罗夫 配音)、雪宝(乔什·盖德 配音)和驯鹿斯特共同开启一场非凡的冒险旅程。艾莎曾担心世界不能接受自己的冰雪魔法,但在《冰雪奇缘2》中她却必须祈祷自己的魔法足够强大,能够拯救世界。本片由奥斯卡金牌团队打造——导演珍妮弗·李和克里斯·巴克、制作人彼得·戴尔·维克以及词曲作者克里斯汀·安德森-洛佩兹及罗伯特·洛佩兹悉数回归,原配音班底伊迪娜·门泽尔、克里斯汀·贝尔、乔纳森·格罗夫和乔什·盖德再度加盟。华特迪士尼动画工作室荣誉出品《冰雪奇缘2》将于2019年11月22日登陆北美院线。' }, { title: '复仇者联盟4:终局之战d', style: 'vod', thumb: 'https://p0.meituan.net/moviemachine/f7d2ad70eb79d6d9b8a197713db9b8c41711752.jpg@464w_644h_1e_1c', label: '动作,冒险,奇幻', summary: '一声响指,宇宙间半数生命灰飞烟灭。几近绝望的复仇者们在惊奇队长(布丽·拉尔森 饰)的帮助下找到灭霸(乔什·布洛林 饰)归隐之处,却得知六颗无限宝石均被销毁,希望彻底破灭。如是过了五年,迷失在量子领域的蚁人(保罗·路德 饰)意外回到现实世界,他的出现为幸存的复仇者们点燃了希望。与美国队长(克里斯·埃文斯 饰)冰释前嫌的托尼(小罗伯特·唐尼 饰)找到了穿越时空的方法,星散各地的超级英雄再度集结,他们分别穿越不同的时代去搜集无限宝石。而在这一过程中,平行宇宙的灭霸察觉了他们的计划。 注定要载入史册的最终决战,超级英雄们为了心中恪守的信念前仆后继……' }, // live { title: '样式:live', style: 'category' }, { title: 'Coding...', style: 'live', image: 'https://weiliicimg9.pstatp.com/weili/l/778002376200945690.webp', label: '英雄联盟', viewerCount: '1.1k', author: { name: 'linroid', avatar: 'https://linroid.com/avatar.png' } }, { title: 'Coding...', style: 'live', image: 'https://weiliicimg9.pstatp.com/weili/l/778002376200945690.webp', label: '英雄联盟', author: { name: 'linroid', avatar: 'https://linroid.com/avatar.png' } }, { title: 'Coding...', style: 'live', image: 'https://weiliicimg9.pstatp.com/weili/l/778002376200945690.webp', spanCount: 12, label: '英雄联盟', author: { name: 'linroid', avatar: 'https://linroid.com/avatar.png' } }, // richMedia { title: '样式:richMedia', style: 'category' }, { title: 'Title goes here', style: 'richMedia', image: 'https://weiliicimg9.pstatp.com/weili/l/778002376200945690.webp', rating: { score: 4.5, total: 5, text: '4.5(1000)' }, summary: 'Secondary line text Lorem ipsum dolor sit amet, nec no nominavi scaevola. Per et sint sapientem, nobis perpetua salutandi mei te.', subtitle: 'Subtitle goes here', tags: [ { title: 'Tag 1', onClick: this.simpleOnClick }, { title: 'Tag 2', onClick: this.simpleOnClick }, { title: 'Tag 3', onClick: this.simpleOnClick } ], actions: [ { title: 'Action1', onClick: this.simpleOnClick }, { title: 'Action 2', onClick: this.simpleOnClick } ] }, // category { title: '样式:gallery', style: 'category' }, { title: 'gallery', style: 'gallery', image: 'https://weiliicimg9.pstatp.com/weili/l/778002376200945690.webp', author: { name: 'linroid', avatar: 'https://avatars0.githubusercontent.com/u/3192142?s=460&v=4' } }, // category { title: '样式:book', style: 'category' }, { image: 'https://img1.doubanio.com/view/subject/l/public/s2768378.jpg', title: '三体', style: 'book' }, { image: 'https://img3.doubanio.com/view/subject/l/public/s8958650.jpg', title: 'JavaScript高级程序设计', style: 'book' }, // article { title: '样式: article', style: 'category' }, { time: 'just now', title: '任天堂 Switch 国行版上市, 腾讯提供本地化网络服务', style: 'article', author: { name: 'xx媒体' }, image: 'https://weiliicimg9.pstatp.com/weili/l/778002376200945690.webp', summary: '12 月 4 日,腾讯集团和任天堂在上海举行发布会,宣布腾讯引进的任天堂新世代游戏机 Nintendo Switch 将于 12 月 10 日正式发售 ... 有「马力欧之父」称号的任天堂株式会社代表取缔役、专门领域开发主导宫本茂通过视频形式表示:任天堂长久以来,一直希望可以为中国顾客提供任天堂的游戏娱乐,现在这个梦想得以实现,真的感到十分高兴,也十分感谢 ... 腾讯游戏任天堂合作部总经理钱赓介绍,关于未来 Nintendo Switch 的网络服务方面,腾讯在国内架设了适合中国网络环境的网络系统,将通过云服务,设立了本地化的网络服务' }, // richContent { title: '样式: richContent', style: 'category' }, { title: 'README.md', style: 'richContent', content: { url: 'https://docs.dorajs.com/', markdown: this.readReadme() } }, { title: '百度一下', style: 'richContent', content: { url: 'https://baidu.com/' } } ] } ] } ] }, simpleOnClick(data) { $ui.toast(`onClick ${JSON.stringify(data)}`) }, readReadme() { return fs.readFileSync(path.resolve(process.cwd(), 'README.md'), { encoding: 'utf8' }) }}