当前位置: 首页 > 面试题库 >

如何在使用useContext的React Hook时更改Context值

韦寒
2023-03-14
问题内容

useContextReact 16.8+上使用钩子效果很好。您可以创建一个组件,使用该钩子并利用上下文值,而不会出现任何问题。

我不确定的是如何将更改应用于Context Provider值。

1)useContext挂钩是否严格地是一种使用上下文值的方法?

2)是否有使用React钩子的推荐方法来更新子组件的值,然后该子组件将使用useContext此上下文的钩子触发任何组件的组件重新渲染?

const ThemeContext = React.createContext({

  style: 'light',

  visible: true

});



function Content() {

  const { style, visible } = React.useContext(ThemeContext);



  const handleClick = () => {

    // change the context values to

    // style: 'dark'

    // visible: false

  }



  return (

    <div>

      <p>

        The theme is <em>{style}</em> and state of visibility is

        <em> {visible.toString()}</em>

      </p>

      <button onClick={handleClick}>Change Theme</button>

    </div>

  )

};



function App() {

  return <Content />

};



const rootElement = document.getElementById('root');

ReactDOM.render(<App />, rootElement);


<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.2/umd/react.production.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.2/umd/react-dom.production.min.js"></script>

问题答案:

在如何避免向下传递回调中讨论了如何使用钩子更新上下文。Hooks常见问题的一部分。

createContext仅当所使用的组件在树上useContext没有该组件时,传递给的参数才是默认值Provider。相反Provider,您可以创建一个提供stylevisibility以及用于切换它们的功能的。

const { createContext, useContext, useState } = React;



const ThemeContext = createContext(null);



function Content() {

  const { style, visible, toggleStyle, toggleVisible } = useContext(

    ThemeContext

  );



  return (

    <div>

      <p>

        The theme is <em>{style}</em> and state of visibility is

        <em> {visible.toString()}</em>

      </p>

      <button onClick={toggleStyle}>Change Theme</button>

      <button onClick={toggleVisible}>Change Visibility</button>

    </div>

  );

}



function App() {

  const [style, setStyle] = useState("light");

  const [visible, setVisible] = useState(true);



  function toggleStyle() {

    setStyle(style => (style === "light" ? "dark" : "light"));

  }

  function toggleVisible() {

    setVisible(visible => !visible);

  }



  return (

    <ThemeContext.Provider

      value={{ style, visible, toggleStyle, toggleVisible }}

    >

      <Content />

    </ThemeContext.Provider>

  );

}



ReactDOM.render(<App />, document.getElementById("root"));


<script src="https://unpkg.com/react@16/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>



<div id="root"></div>


 类似资料:
  • 本文向大家介绍在React.js中使用useContext,包括了在React.js中使用useContext的使用技巧和注意事项,需要的朋友参考一下 useContext钩子允许在不使用redux的情况下将数据传递给子元素。 useContext是react中的一个命名导出,因此我们可以导入如下的功能组件- 如果我们只需要将数据传递给child元素,则它是Redux的简单替代方案。 创建上下文的

  • 如何在运行时更改application.yaml的值?例如,我有一个服务器地址属性,希望在运行时更改

  • 问题内容: 我想要类似的东西: 问题答案: 类更改时不会引发任何事件。另一种方法是在以编程方式更改类时手动引发事件: 更新 这个问题似乎正在吸引一些访问者,因此这里是一种更新方法,可以使用该方法而不必使用new修改现有代码: 请注意,只能用于更新的浏览器,特别是Chrome 26,FF 14,IE 11,Opera 15和Safari6。如果需要支持旧版浏览器,则需要使用我在第一个示例中概述的方法

  • 问题内容: 我正在使用UCanAccess JDBC驱动程序(版本3.0.3.1)连接到mdb文件。我需要将该列添加到现有表中。问题是该语句 引发异常: 似乎没有新版本的UCanAccess。 在这种情况下我该怎么办?由于多种原因,我不想使用ODBC驱动程序(在此进行说明- 从不使用ODBC的Java中操作Access数据库) 我看到的唯一解决方案是创建表的副本(例如TEmployeeBackup

  • 所以我开始了一个个人简历网站,我偶然发现了一个非常酷的东西:font awesome,它以文本的形式提供图形,允许你通过CSS添加字体效果。我的问题是一切都很好,直到我试图改变字体大小,无论什么原因,它就是不会改变。你有什么想法吗?我也是新的这里,我已经阅读通过如何使帖子,但如果我做错了,请让我知道。

  • 我正在创建一个应用程序来测试我的Java技能,我使用NetBeans是因为GUI构建器,因为我还不太习惯手工铺设GUI(GUI在Swing中)。我有一个简单的登录表单,如果登录信息正确,它就会消失,并被不同的GUI元素替换。我如何制作用GUI构建器替换登录页面的第二个页面?