React(11)组件通信

x33g5p2x  于2022-03-06 转载在 其他  
字(1.8k)|赞(0)|评价(0)|浏览(579)

17、组件通信

这个很好理解,我们开发常面对几种情况:

  1. 子组件 需要使用 父组件 的值:通过标签传入,props取值,如:<Status temperaature={this.state.temperaature}></Status>
  2. 父组件 需要使用 子组件 的值:不能直接将父组件值传入子组件并在子组件修改(不好),应采用父组件传函数到子组件,子组件调用父组件的该函数,并通过函数参数传值;
  3. 子组件 需要使用 另一个子组件 的值:将值存储在 父组件 中,第一步通过【2】中的方法,数据来源子组件修改存于父组件的值,第二步通过【1】中的方法,目标子组件使用了修改后的值;

这里放一个示例:

父组件Parent 存储变量temperaature,子组件Status 负责显示这个变量的值,子组件Controller 负责修改这个变量的值。

如代码:

  1. // 显示组件
  2. class Status extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. }
  6. render() {
  7. return <div>
  8. 当前温度:{this.props.temperaature} 摄氏度
  9. </div>
  10. }
  11. }
  12. // 控制组件
  13. class Controller extends React.Component {
  14. constructor(props) {
  15. super(props);
  16. }
  17. render() {
  18. return <div>
  19. {/* 通过调用父组件传给子组件的 onControllerChange 来实现修改,传值的不同是参数 */}
  20. {/* 这两种写法,都可以实现目的,但假如没有在父组件绑定this(应该不会吧),会导致下面那种写法的this指向错误 */}
  21. <button onClick={e => {
  22. this.props.onControllerChange(true)
  23. }}>点击开始自动升温
  24. </button>
  25. <button onClick={this.props.onControllerChange.bind(null, false)}>点击开始自动降温</button>
  26. </div>
  27. }
  28. }
  29. // 父组件
  30. class Parent extends React.Component {
  31. constructor(props) {
  32. super(props);
  33. this.state = {
  34. temperaature: 0
  35. }
  36. // 注意,因为这里绑定了this,所以后面子组件再次绑定this是无效的
  37. this.changeTemplate = this.changeTemplate.bind(this)
  38. this.timer
  39. }
  40. render() {
  41. return <div>
  42. <Status temperaature={this.state.temperaature}></Status>
  43. <Controller temperaature={this.state.temperaature}
  44. onControllerChange={this.changeTemplate}></Controller>
  45. </div>
  46. }
  47. changeTemplate(status) {
  48. console.log(this)
  49. if (this.timer) {
  50. clearInterval(this.timer)
  51. }
  52. if (status) {
  53. this.timer = setInterval(() => {
  54. // 如果大于等于100,则停止计时器并返回
  55. if (this.state.temperaature >= 100) {
  56. return clearInterval(this.timer)
  57. }
  58. this.setState({
  59. temperaature: this.state.temperaature + 1
  60. })
  61. }, 200)
  62. } else {
  63. this.timer = setInterval(() => {
  64. // 如果小于等于-100,则停止计时器并返回
  65. if (this.state.temperaature <= -100) {
  66. return clearInterval(this.timer)
  67. }
  68. this.setState({
  69. temperaature: this.state.temperaature - 1
  70. })
  71. }, 200)
  72. }
  73. }
  74. }

相关文章