条件渲染

  1. {this.state.flag && <p>你好</p>} // 短路原则
  2. {this.state.flag ? <p>你好</p> : ''} // 三目运算符
  • 案例

实现:页面加载时显示loading…3秒后内容自动出现,点击按钮再次进入loading…状态,3秒后再显示内容

  1. import { Component } from 'react'
  2. export default class App extends Component {
  3. constructor() {
  4. super()
  5. this.state = {
  6. content: ['a', 'b', 'c', 'd'],
  7. flag: true
  8. }
  9. }
  10. componentDidMount() {
  11. setTimeout(() => {
  12. this.setState ({
  13. flag: !this.state.flag
  14. })
  15. }, 3000)
  16. }
  17. Updata=()=>{
  18. this.setState({
  19. flag:!this.state.flag
  20. },()=>{
  21. setTimeout(()=>{
  22. this.setState({
  23. flag:!this.state.flag
  24. })
  25. },2000)
  26. })
  27. }
  28. render() {
  29. const { flag, content } = this.state
  30. if (flag) {
  31. return (
  32. <>loading...</>
  33. )
  34. } else {
  35. return (
  36. <>
  37. <button onClick={this.Updata}>刷新</button>
  38. <ul>
  39. {content.map((item, index) => {
  40. return (
  41. <li key={index}>{item}</li>
  42. )
  43. })}
  44. </ul>
  45. </>
  46. )
  47. }
  48. }
  49. }

列表渲染

通过 数据.map(callback) return 返回节点节点内容使用单{}语法渲染

  1. import { Component } from 'react'
  2. export default class App extends Component {
  3. constructor() {
  4. super()
  5. this.state = {
  6. people: [{
  7. id: 1,
  8. name: 'syukinmei',
  9. age: 21
  10. }, {
  11. id: 2,
  12. name: 'ebiebi',
  13. age: 18
  14. }],
  15. }
  16. }
  17. render() {
  18. const { people } = this.state
  19. return (
  20. <div>
  21. {
  22. people.map(person => {
  23. return (
  24. <dl key={person.id}>
  25. <dt>{person.name}</dt>
  26. <dd>age: {person.age}</dd>
  27. </dl>
  28. )
  29. })
  30. }
  31. </div>
  32. )
  33. }
  34. }
  • 案例

实习:点击按钮发送数据请求,有loading效果,请求成功渲染数据

  1. import { Component } from 'react'
  2. export default class App extends Component {
  3. constructor() {
  4. super()
  5. this.state = {
  6. list: [], // 必须写数组
  7. flag: false
  8. }
  9. }
  10. getData = () => {
  11. this.setState({
  12. flag:true
  13. })
  14. fetch('http://59.110.226.77:3000/api/category')
  15. .then(data => data.json()) // 数据格式化处理
  16. .then(
  17. res => {
  18. this.setState({
  19. flag:false,
  20. list: res.data.data
  21. })
  22. }
  23. )
  24. .catch(error => Promise.reject(error))
  25. }
  26. render() {
  27. const { list,flag } = this.state
  28. return (
  29. <div>
  30. <button color='red' onClick={this.getData}>发生数据请求</button>
  31. {flag&&<div>loading...</div>}
  32. {list.length ? <ul>
  33. {list.map((item, index) => <li key={index}>{item.name}</li>)}
  34. </ul>:null}
  35. </div>
  36. )
  37. }
  38. }

Line6中list初始值必须是空数组,不能是null或者空字符串,因为Line33中map的使用前提是list必须是个数组

  1. this.state = {
  2. list: null,
  3. flag: false
  4. }
  5. {list.list.map((item, index) => <li key={index}>{item.name}</li>)}
  6. // 如果list不是写成数组 需要做判断list是否存在