通用约束与建议

所有内置组件均需要引入后再使用

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View } from '@tarojs/components'
  3. class MyComponent extends Component {
  4. render () {
  5. return (
  6. <View className='test'> // ✓ 正确
  7. <Text>12</Text> // 错误
  8. </View>
  9. )
  10. }
  11. }

推荐使用对象解构的方式来使用 state、props

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View, Input } from '@tarojs/components'
  3. class MyComponent extends Component {
  4. state = {
  5. myTime: 12
  6. }
  7. render () {
  8. const { isEnable } = this.props // ✓ 正确
  9. const { myTime } = this.state // ✓ 正确
  10. return (
  11. <View className='test'>
  12. {isEnable && <Text className='test_text'>{myTime}</Text>}
  13. </View>
  14. )
  15. }
  16. }

不要以 class/id/style 作为自定义组件的属性名

  1. <Hello class='foo' /> // ✗ 错误
  2. <Hello id='foo' /> // ✗ 错误
  3. <Hello style='foo' /> // ✗ 错误

不要使用 HTML 标签

  1. <div className='foo'></div> // 错误
  2. <span id='foo' /></span> // 错误

不要在调用 this.setState 时使用 this.state

由于 this.setState 异步的缘故,这样的做法会导致一些错误,可以通过给 this.setState 传入函数来避免

  1. this.setState({
  2. value: this.state.value + 1
  3. }) // ✗ 错误
  4. this.setState(prevState => ({ value: prevState.value + 1 })) // ✓ 正确

map 循环时请给元素加上 key 属性

  1. list.map(item => {
  2. return (
  3. <View className='list_item' key={item.id}>{item.name}</View>
  4. )
  5. })

尽量避免在 componentDidMount 中调用 this.setState

因为在 componentDidMount 中调用 this.setState 会导致触发更新

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View, Input } from '@tarojs/components'
  3. class MyComponent extends Component {
  4. state = {
  5. myTime: 12
  6. }
  7. componentDidMount () {
  8. this.setState({ // ✗ 尽量避免,可以在 componentWillMount 中处理
  9. name: 1
  10. })
  11. }
  12. render () {
  13. const { isEnable } = this.props
  14. const { myTime } = this.state
  15. return (
  16. <View className='test'>
  17. {isEnable && <Text className='test_text'>{myTime}</Text>}
  18. </View>
  19. )
  20. }
  21. }

不要在 componentWillUpdate/componentDidUpdate/render 中调用 this.setState

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View, Input } from '@tarojs/components'
  3. class MyComponent extends Component {
  4. state = {
  5. myTime: 12
  6. }
  7. componentWillUpdate () {
  8. this.setState({ // ✗ 错误
  9. name: 1
  10. })
  11. }
  12. componentDidUpdate () {
  13. this.setState({ // ✗ 错误
  14. name: 1
  15. })
  16. }
  17. render () {
  18. const { isEnable } = this.props
  19. const { myTime } = this.state
  20. this.setState({ // ✗ 错误
  21. name: 11
  22. })
  23. return (
  24. <View className='test'>
  25. {isEnable && <Text className='test_text'>{myTime}</Text>}
  26. </View>
  27. )
  28. }
  29. }

不要定义没有用到的 state

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View, Input } from '@tarojs/components'
  3. class MyComponent extends Component {
  4. state = {
  5. myTime: 12,
  6. noUsed: true // ✗ 没有用到
  7. }
  8. render () {
  9. const { myTime } = this.state
  10. return (
  11. <View className='test'>
  12. <Text className='test_text'>{myTime}</Text>
  13. </View>
  14. )
  15. }
  16. }

组件最好定义 defaultProps

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View, Input } from '@tarojs/components'
  3. class MyComponent extends Component {
  4. static defaultProps = {
  5. isEnable: true
  6. }
  7. state = {
  8. myTime: 12
  9. }
  10. render () {
  11. const { isEnable } = this.props
  12. const { myTime } = this.state
  13. return (
  14. <View className='test'>
  15. {isEnable && <Text className='test_text'>{myTime}</Text>}
  16. </View>
  17. )
  18. }
  19. }

render 方法必须有返回值

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View, Input } from '@tarojs/components'
  3. class MyComponent extends Component {
  4. state = {
  5. myTime: 12
  6. }
  7. render () { // ✗ 没有返回值
  8. const { isEnable } = this.props
  9. const { myTime } = this.state
  10. <View className='test'>
  11. {isEnable && <Text className="test_text">{myTime}</Text>}
  12. </View>
  13. }
  14. }

值为 true 的属性可以省略书写值

  1. <Hello personal />
  2. <Hello personal={false} />

JSX 属性或者表达式书写时需要注意空格

属性书写不带空格,如果属性是一个对象,则对象括号旁边需要带上空格

  1. <Hello name={ firstname } /> // ✗ 错误
  2. <Hello name={ firstname} /> // ✗ 错误
  3. <Hello name={firstname } /> // ✗ 错误
  4. <Hello name={{ firstname: 'John', lastname: 'Doe' }} /> // ✓ 正确

事件绑定均以 on 开头

在 Taro 中所有默认事件如 onClickonTouchStart 等等,均以 on 开头

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View, Input } from '@tarojs/components'
  3. class MyComponent extends Component {
  4. state = {
  5. myTime: 12
  6. }
  7. clickHandler (e) {
  8. console.log(e)
  9. }
  10. render () {
  11. const { myTime } = this.state
  12. return (
  13. <View className='test' onClick={this.clickHandler}> // ✓ 正确
  14. <Text className='test_text'>{myTime}</Text>
  15. </View>
  16. )
  17. }
  18. }

子组件传入函数时属性名需要以 on 开头

  1. import Taro, { Component } from '@tarojs/taro'
  2. import { View, Input } from '@tarojs/components'
  3. import Tab from '../../components/Tab/Tab'
  4. class MyComponent extends Component {
  5. state = {
  6. myTime: 12
  7. }
  8. clickHandler (e) {
  9. console.log(e)
  10. }
  11. render () {
  12. const { myTime } = this.state
  13. return (
  14. <View className='test'>
  15. <Tab onChange={this.clickHandler} /> // ✓ 正确
  16. <Text className='test_text'>{myTime}</Text>
  17. </View>
  18. )
  19. }
  20. }