useContext 父子组件传值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import React, { createContext, useContext, useState } from "react";



const CntCtx = createContext()

function Child1() {
  let parentCnt = useContext(CntCtx)
  return (
    <div>
      child1 {parentCnt}
    </div>
  )
}

function Child2() {
  let parentCnt = useContext(CntCtx)
  return (
    <div>
      child2 
      {parentCnt}
    </div>
  )
}

export default function ContextExample() {
  const [ cnt, setCnt ] = useState(0)
  setInterval(()=>{
    setCnt(cnt+1)
  },3000)
  return (
    <div>
      hello world
      <CntCtx.Provider value={cnt}>
        <Child1 />

      </CntCtx.Provider>
    </div>
  )
}

这样 子组件就可以获得 cnt 了

react 中的陷阱

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import React, { createContext, useContext, useEffect, useState } from "react";



const CntCtx = createContext()

function Child1() {
  let parentCnt = useContext(CntCtx)
  return (
    <div>
      child1 {parentCnt}
    </div>
  )
}

function Child2() {
  let parentCnt = useContext(CntCtx)
  return (
    <div>
      child2 
      {parentCnt}
    </div>
  )
}

export default function ContextExample() {
  const [ cnt, setCnt ] = useState(0)
  useEffect(()=>{
    setTimeout(()=>{
      setCnt(cnt+1000)
    },2000)
  },[])


  
  return (
    <div>
      hello world
      <CntCtx.Provider value={cnt}>
        <Child1 />

      </CntCtx.Provider>
    </div>
  )
}

以上代码 只会执行1次

为什么要 将 setTimeout 防止 useEffect 中呢?

如果直接放在 函数里面设置定时器,最后 页面 的 cnt 更新一次,就会被刷新一次,然后反复执行 useState , 这是有问题的

cnt 被添加一次 , 整个函数就会执行1次, 这就是无状态组件的原理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import React, { createContext, useContext, useEffect, useState } from "react";



const CntCtx = createContext()

function Child1() {
  let parentCnt = useContext(CntCtx)
  return (
    <div>
      child1 {parentCnt}
    </div>
  )
}

function Child2() {
  let parentCnt = useContext(CntCtx)
  return (
    <div>
      child2 
      {parentCnt}
    </div>
  )
}

export default function ContextExample() {
  const [ cnt, setCnt ] = useState(0)
 
  // setTimeout(()=>{
  //   setCnt(cnt+1000)
  // },2000)
   
  console.log(`页面重新绘制 ${cnt}`)


  return (
    <div>
      hello world

      <button onClick={()=> setCnt(cnt+1)} >
       add </button>
      <CntCtx.Provider value={cnt}>
        <Child1 />

      </CntCtx.Provider>
    </div>
  )
}