特性(attribute)与 HTML 中元素特性类似,提供了与 QAP/Rax 元素有关的其他附加信息。所有的元素都可以拥有特性, 特性总是在 QAP/Rax 元素的起始标签中定义,并总是以键值对的形式出现,例如:name=“value”。
QAP/Rax 遵循 HTML attribute 命名规范, 所以请 不要在特性中使用驼峰风格(CamelCase) , 使用-连接符的羊肉串风格(kebab-case) 才是更好的命名方式。
所有 QAP/Rax 元素都拥有以下特性:
为元素设置唯一的id
,通过函数findDOMNode
很容易的获取该元素的引用。
'use strict'; import {createElement, Component, render, findDOMNode} from 'rax'; import {View, Text, TouchableHighlight, Modal} from 'nuke'; class TestComponent extends Component { render() { return ( <text id="hi">hi</text> ); } } render(<TestComponent />); const node = findDOMNode('hi'); Modal.alert(node);
append 特性用于控制渲染次序。它的可选值为 tree
或 node
,默认为tree
,不支持数据绑定。不同的值会执行不同的渲染过程:
append="tree"
是一次性渲染整个节点树,渲染更高效,但是如果页面太大容易造成较长时间的白屏。append="node"
所有节点逐个渲染,整体渲染速度略慢,但是用户体验好一些。node
和 tree
可以精细化地控制页面展示的逻辑和颗粒度,一般比较好的实践为首屏以内按 tree
解析,首屏以外按 node
解析。render() { return ( <View> <Text append="node">简单的文本</Text> <Text append="tree">简单的文本</Text> </View>) }
为元素定义行内样式
<text style={{color:'red'}}>red color</text>
或者
'use strict'; import {createElement, Component, render, findDOMNode} from 'rax'; import {View, Text, TouchableHighlight, Modal} from 'nuke'; class TestComponent extends Component { render() { return ( <text style={styles.redColor}>red color</text> ); } } const styles = { redColor:{ color:'red' } } render(<TestComponent />);
style属性比较容易理解,和传统的web一样,但具体的用法会有一点区别,具体请参考样式一章。
一般来说,父类更新子类元素可以通过传递Props方式完成该目的。QAP/Rax和React一样,也提供了ref属性为元素定义引用,达到方便控制子类元素的目的。
'use strict'; import { createElement, Component, render, findDOMNode } from 'rax'; import { View, Text, TouchableHighlight, Modal, Button, ListView, Image, Link, Navigator, Input } from 'nuke'; import QN from 'QAP-SDK'; class Demo extends Component { onPress = () => { this.input && this.input.focus(); } render() { return ( <View style={{alignItems:'center', flex:1}}> <Input ref={(com)=>this.input = com} style={{ width: '400rem', height: '100rem', borderWidth: 2, borderStyle: 'solid', borderColor: 'black', mairgin:20 }}/> <Button onPress={this.onPress}>点击输入框获取焦点</Button> </View>); } } render(<Demo />)
Functional Components
使用ref下面的例子,无法通过ref属性让Input
获取焦点。
'use strict'; import { createElement, Component, render, findDOMNode } from 'rax'; import { View, Text, TouchableHighlight, Modal, Button, ListView, Image, Link, Navigator, Input } from 'nuke'; import QN from 'QAP-SDK'; function MyFunctionalComponent() { return (<Input ref={(com)=>this.input = com} style={{ width: '400rem', height: '100rem', borderWidth: 2, borderStyle: 'solid', borderColor: 'black', mairgin:20 }}/>); } class Demo extends Component { onPress = () => { Modal.alert(`this.input is undefined ? ${this.input===undefined}`); this.input && this.input.focus(); } render() { return ( <View style={{alignItems:'center'}}> <MyFunctionalComponent ref={(com)=>this.input = com}/> <Button onPress={this.onPress}>点击输入框获取焦点</Button> </View>); } } render(<Demo />);
注意:
以下情况之外请避免滥用ref
属性。
1.控制空间的焦点、文字选择或者多媒体播放。
2.触发动画等相关操作
3.开发DOM节点操作的类库等