小程序的 wxml
只支持 view
、text
与它的那些内置组件标签,娜娜奇可以让你直接使用 div
, span
, p
, b
, strong
等 HTML 标签。块状元素会转换成 view
, 内联元素会转换为 text
。
如果你使用 React 方式定义组件,那么对应的标签名必须以大写开头。
在小程序中,组件不支持包含其他标签,但我们的 React 组件可以充许包含其他标签或组件。
有关for循环,多重循环, if分支, 组件套组件 等用法,可以脚手架的 qunar 示例
为了兼容所有平台,我们定下这些规则
<div> </div
与<div> 111 </div
,它们会变成 <div></div
与<div>111</div
<div><span>xxx</span></div>
应该改成<div><text>xxx</text></div>
,因为在快应用下span只能出现在text标签下,不能放在div下面。
错误的用法<Login>
<p>我是文本</p>
</Login>
正确的用法
<Login>
<p><text>我是文本</text></p>
<p><span>我是文本</span></p>
</Login>
错误的用法
<div aaa={this.title}>{this.data.content}</div>
正确的用法, 所有数据都只能来自this.props, this.state, this.context
<div aaa={this.props.title}>{this.state.content}</div>
如果这是一个无状态组件,则这样用
function AA(props, context){
return <div aaa={props.title}>{context.content}</div>
}
错误的用法
render() {
return this.state.isOk ? null : <div>Home Page</div>;
}
翻译出的XML会出现 null字样,因为{{null}}
会null +"" 变成"null"
<block a:if="{{state.isOk}}">{{null}}</block><block a:else="true"><view>Home Page</view></block>
正确的用法
三元表达式与&&逻辑语句会转换为block标签,在快应用中,组件的根节点不能为block标签,因此需要包一层
render() {
return <div>{ this.state.isOk ? <div>Home Page</div>: null }<div>
}
翻译出的XML体积还小这么多
<div><block a:if="{{state.isOk}}"><view>Home Page</view></block></div>
错误的用法
render() {
return if( this.state.isOk ) {
return <div>Home Page</div>
} else{
return "" //null会直接输出null,最好改成空字符串
}
}
do表达式也不允许
// https://babeljs.io/docs/en/babel-plugin-proposal-do-expressions
const Component = props =>
<div className='myComponent'>
{do {
if(color === 'blue') { <BlueComponent/>; }
else if(color === 'red') { <RedComponent/>; }
else if(color === 'green') { <GreenComponent/>; }
}}
</div>
如果真的遇上这么复杂的分支判定,可以使用三元套三元
// https://babeljs.io/docs/en/babel-plugin-proposal-do-expressions
const Component = props =>
<div className='myComponent'>
{ color === 'blue' ? <BlueComponent/> : (
color === 'red' ? <RedComponent/> : (
color === 'green' ? <GreenComponent/>: ""
))
}
</div>
错误的用法
<div onTap={this.props.fn}>点我</div>
正确的用法, 事件必须直接以this开头,来源于实例
<div onTap={this.fn}>点我</div>
<ul>{
this.state.list.map(function(el, index){
return <li onClick={this.click1.bind(el, index)}>{el.name}</li>
},this)
}</ul>
错误的用法
class A extends React.Component{
render(){
var a = this.props
return <div aaa={a.title}>{a.content}</div>
}
}
正确的用法
class A extends React.Component{
render(){
return <div aaa={this.props.title}>{this.props.content}</div>
}
}
在早期的百度小程序中s-for指令不支持数组字面量,1.14.13已经修复
class A extends React.Component{
render(){
return <div>{
[111,222,333].map(function(el){
return <p>{el}</p>
})
}</div>
}
}