关于context跟hooks的一个问题

来源:5-6 Router原理及React-router

李行知

2019-01-15

#提问#
关于hooks跟context一起使用的代码导致的一个问题。
我希望在子组件中调用方法来改变context中的值,一开始是通过props来进行传函数进行改变。
代码类似下面这样

  const [is,setIs]=useState(false)
  const changeTheme = () => {
    console.log(is);
    setIs(!is)
    console.log(theme.theme.color);
    if(theme.theme.color==='block'){
      setTheme(themeDark)
    }else{
      setTheme(themeLight)
    }
    // setTheme((pre) => {
    //   if (pre.theme.color === 'black') {
    //     return themeDark
    //   }
    //   else {
    //     return themeLight
    //   }
    // })
  }
  const themeLight = {
    theme: {
      color: 'black',
      background: 'white',
    },
    changeTheme
  }

  const themeDark = {
    theme: {
      color: 'white',
      background: 'black',
    },
    changeTheme
  }
  const [theme, setTheme] = useState(themeLight)

app.js

              <Header changeTheme={changeTheme}/>

Header.js

          <div onClick={()=>props.changeTheme()} style={context.theme}>主题</div>

这样是可以正确的
false true false true的输出的
但是无法改变color
而如果我使用了被注释的代码,则可以显示值
如果我在Header.js中
使用
<div onClick={()=>context.changeTheme()} style={context.theme}>主题

这样的代码 则clg is 一直为false
求解

写回答

2回答

Rosen

2019-01-18

发现两个问题

  1. 这里应该是theme.color吧,不是你写的theme.theme
     //img.mukewang.com/szimg/5c41cecf0001f4ed06580278.jpg

  2. theme对象里放了changeTheme方法有些奇怪,没次改变状态的时候还要重置下方法?不应该是新版本的新用法吧?

0
4
李行知
回复
Rosen
好吧,看到官网是放到里面处理的,其实确实有点,那假如不放到这里面应该怎么处理呢?只能逐级传递吗?现在看起来比较好的还是使用redux这种工具,但是这样就会引入第三方依赖
2019-01-21
共4条回复

Rosen

2019-01-17

<Header changeTheme={changeTheme}/> 这里的changeTheme从哪来的?改变主题的话,应该要有setState,或者调用父级方法的操作。看这坨代码有点乱,你再捋捋,不行打包发我看看

0
1
李行知
https://codesandbox.io/s/r4jvk6nz6m 老师看下这个。我把代码整理了一下
2019-01-18
共1条回复

React16+React-Router4 打造企业级电商后台管理系统

【毕设面试】让缺乏框架开发经验的你掌握框架开发

976 学习 · 405 问题

查看课程