通用组件

通用组件必须定义在 components 目录中,里面建一个文件夹与组件名同名,下面 index.js 就是你编写组件的地方。

组件的样板

  1. //components/Animal/index.js
  2. import React from '@react';
  3. class Animal extends React.Component { //组件名必须大写开头,与目录名一样
  4. constructor(props) {
  5. super();
  6. this.state = {
  7. name: props.name,
  8. age: props.age || 1
  9. };
  10. }
  11. static defaultProps = {
  12. age: 1,
  13. name: 'animal'
  14. };
  15. changeAge() {
  16. this.setState({
  17. age: ~~(Math.random() * 10)
  18. });
  19. }
  20. componentDidMount() {
  21. console.log('Animal componentDidMount');
  22. }
  23. componentWillReceiveProps(props) {
  24. this.setState({
  25. name: props.name
  26. });
  27. }
  28. render() {
  29. return (
  30. <div style={{ border: '1px solid #333' }}>
  31. 名字:
  32. {this.state.name} 年龄:
  33. {this.state.age}
  34. <button catchTap={this.changeAge.bind(this)}>换一个年龄</button>
  35. </div>
  36. );
  37. }
  38. }
  39. export default Animal;

由于目录可能比较深,因此 nanachi 比较贴心地提供了两个默认的别名,@react@components, @react 指向专门为小程序优化的 React, @components 指向开发目录下的 components 目录。

JSX 只能出现在 render() 方法或无状态组件的函数体中。

JSX 的所有填充数据必须带 this.props, this.state, this.context 前缀。

render() 方法里不能出现 var/const/let 语句,只能出现 if 语句与三元表达式或 JSX。

map() 方法调用的第一个参数最好使用匿名方法(因为这样会自动 bind this),否则它会自动添加上第二个参数 this

  1. <div class="group">
  2. {this.state.iconSize.map(function(item) {
  3. return <icon type="success" size={item} />;
  4. })}
  5. </div>

会变成

  1. <div class="group">
  2. {this.state.iconSize.map(function(item) {
  3. return <icon type="success" size={item} />;
  4. }, this)}
  5. </div>

JSX 禁止出现 instanceUid, classUid, eventUid, 这些是内部绑定事件时在编译阶段自动添加的。

render方法的第一个语句只能元素节点,不能是三元表达式或if语句等表示逻辑性的东西错误的写法

  1. class Dog extends React.Component{
  2. //....略
  3. render(){
  4. return this.props.xxx ? <div>分支1</div>: <div>分支2</div>
  5. }
  6. }

正确的写法

  1. class Dog extends React.Component{
  2. //....略
  3. render(){
  4. return <div>{this.props.xxx ? <div>分支1</div>: <div>分支2</div>}</div>
  5. }
  6. }

原因是三元表达式会变成block标签,而快应用与自定义组件方式不支持顶层元素为template/block