Javascript 使用上下文和钩子
我正在努力学习如何正确使用上下文和挂钩。我让它工作时,一切都在课堂上,当我把它分成其他类的时候,上下文就找不到了。这就是我所尝试的” 我已将我的应用程序包装到提供商中Javascript 使用上下文和钩子,javascript,reactjs,Javascript,Reactjs,我正在努力学习如何正确使用上下文和挂钩。我让它工作时,一切都在课堂上,当我把它分成其他类的时候,上下文就找不到了。这就是我所尝试的” 我已将我的应用程序包装到提供商中 import React, {useContext} from 'react'; import Header from 'components/Header'; class App extends React.Component { constructor () { super(); this.stat
import React, {useContext} from 'react';
import Header from 'components/Header';
class App extends React.Component {
constructor () {
super();
this.state = {
firstName: "Bob",
lastName: "Joe",
}
}
const {firstName,lastName} = this.state;
return (
<UserContext.Provider value = {{firstName,lastName}}>
<Header/>
</UserContext.Provider>
)
}
import React,{useContext}来自“React”;
从“组件/标题”导入标题;
类应用程序扩展了React.Component{
构造函数(){
超级();
此.state={
名字:“鲍勃”,
姓:“乔”,
}
}
const{firstName,lastName}=this.state;
返回(
)
}
然后在Header中,我创建了一个Navbar函数来尝试使用它
const UserContext = React.createContext();
class Header extends React.Component {
render() {
return (
<div className="header">
<NavBar/>
</div>
);
}
}
function NavBar () {
const {firstName,lastName} = useContext(UserContext);
}
return (
<nav className="navbar">
<span> Hello, {firstName} {lastName} </span>
</nav>
)
}
const UserContext=React.createContext();
类头扩展了React.Component{
render(){
报税表(
);
}
}
函数导航栏(){
const{firstName,lastName}=useContext(UserContext);
}
返回(
你好,{firstName}{lastName}
)
}
我不确定出了什么问题
当我在同一页下使用它时,它是好的
我得到一个错误,即“firstname”未定义。我必须先将其作为状态传递吗?您需要在创建
App.js
文件后从UserContext
文件中导出该文件,或者创建一个新文件,例如导出该上下文的UserContext.js
从那里,您需要从声明NavBar
的文件中导入UserContext
而且,您似乎在App
组件中缺少render()
e、 g.)
UserContext.js
import {createContext} from 'react';
const UserContext = createContext();
export default UserContext;
import React from 'react';
import Header from 'components/Header';
import UserContext from './UserContext';
class App extends React.Component {
constructor () {
super();
this.state = {
firstName: "Bob",
lastName: "Joe",
}
}
render() {
const {firstName,lastName} = this.state;
return (
<UserContext.Provider value = {{firstName,lastName}}>
<Header/>
</UserContext.Provider>
)
}
}
// other react imports omitted...
import UserContext from '../UserContext';
class Header extends React.Component {
render() {
return (
<div className="header">
<NavBar/>
</div>
);
}
}
function NavBar () {
const {firstName,lastName} = useContext(UserContext);
}
return (
<nav className="navbar">
<span> Hello, {firstName} {lastName} </span>
</nav>
)
}
App.js
import {createContext} from 'react';
const UserContext = createContext();
export default UserContext;
import React from 'react';
import Header from 'components/Header';
import UserContext from './UserContext';
class App extends React.Component {
constructor () {
super();
this.state = {
firstName: "Bob",
lastName: "Joe",
}
}
render() {
const {firstName,lastName} = this.state;
return (
<UserContext.Provider value = {{firstName,lastName}}>
<Header/>
</UserContext.Provider>
)
}
}
// other react imports omitted...
import UserContext from '../UserContext';
class Header extends React.Component {
render() {
return (
<div className="header">
<NavBar/>
</div>
);
}
}
function NavBar () {
const {firstName,lastName} = useContext(UserContext);
}
return (
<nav className="navbar">
<span> Hello, {firstName} {lastName} </span>
</nav>
)
}
作为旁注,将整个this.state
对象作为上下文的值传递,而不是像{firstName,lastName}
那样进行分解,因为这样会导致每次传递新对象引用时子组件都重新呈现
所以推荐的方法是
class App extends React.Component {
// ... other codes omitted for brevity
render() {
return (
<UserContext.Provider value = {this.state}>
<Header/>
</UserContext.Provider>
)
}
}
类应用程序扩展了React.Component{
//…为简洁起见,省略了其他代码
render(){
返回(
)
}
}
您需要在App.js
文件中创建UserContext
后将其导出,或者创建一个新文件,例如,UserContext.js
,用于导出上下文
从那里,您需要从声明NavBar
的文件中导入UserContext
而且,您似乎在App
组件中缺少render()
e、 g.)
UserContext.js
import {createContext} from 'react';
const UserContext = createContext();
export default UserContext;
import React from 'react';
import Header from 'components/Header';
import UserContext from './UserContext';
class App extends React.Component {
constructor () {
super();
this.state = {
firstName: "Bob",
lastName: "Joe",
}
}
render() {
const {firstName,lastName} = this.state;
return (
<UserContext.Provider value = {{firstName,lastName}}>
<Header/>
</UserContext.Provider>
)
}
}
// other react imports omitted...
import UserContext from '../UserContext';
class Header extends React.Component {
render() {
return (
<div className="header">
<NavBar/>
</div>
);
}
}
function NavBar () {
const {firstName,lastName} = useContext(UserContext);
}
return (
<nav className="navbar">
<span> Hello, {firstName} {lastName} </span>
</nav>
)
}
App.js
import {createContext} from 'react';
const UserContext = createContext();
export default UserContext;
import React from 'react';
import Header from 'components/Header';
import UserContext from './UserContext';
class App extends React.Component {
constructor () {
super();
this.state = {
firstName: "Bob",
lastName: "Joe",
}
}
render() {
const {firstName,lastName} = this.state;
return (
<UserContext.Provider value = {{firstName,lastName}}>
<Header/>
</UserContext.Provider>
)
}
}
// other react imports omitted...
import UserContext from '../UserContext';
class Header extends React.Component {
render() {
return (
<div className="header">
<NavBar/>
</div>
);
}
}
function NavBar () {
const {firstName,lastName} = useContext(UserContext);
}
return (
<nav className="navbar">
<span> Hello, {firstName} {lastName} </span>
</nav>
)
}
作为旁注,将整个this.state
对象作为上下文的值传递,而不是像{firstName,lastName}
那样进行分解,因为这样会导致每次传递新对象引用时子组件都重新呈现
所以推荐的方法是
class App extends React.Component {
// ... other codes omitted for brevity
render() {
return (
<UserContext.Provider value = {this.state}>
<Header/>
</UserContext.Provider>
)
}
}
类应用程序扩展了React.Component{
//…为简洁起见,省略了其他代码
render(){
返回(
)
}
}
第一个块中没有UserContext
。它们在同一个文件中吗?第一个块中没有UserContext
。它们在同一个文件中吗?