首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在React中使用UseContext时获取未定义的值

在React中使用UseContext时获取未定义的值
EN

Stack Overflow用户
提问于 2021-07-17 16:20:53
回答 3查看 37关注 0票数 1

为了在我的组件中使用useState而创建的上下文:

context.js

代码语言:javascript
运行
复制
const searchContext = React.createContext();

这就是我用searchText创建一个初始状态为空字符串的useState的地方。

Header.js

代码语言:javascript
运行
复制
import { useState } from "react";
import { searchContext } from "./context";
import { useSelector } from 'react-redux';
import Motherboard from "./Components/Motherboard";

function Header() {
  const[searchText,setSearchText] = useState("");

  const cart = useSelector(state => state.cart);

  return (
    <div
      style={{ backgroundColor: "#191C27", paddingLeft: 0, paddingRight: 0 }}
    >
      <Navbar
        variant="light"
        expand="lg"
        style={{ backgroundColor: "#191C27" }}
      >
        <Container>
          <Navbar.Toggle aria-controls="navbarScroll">
            <img src={options} alt="options" width="30px" />
          </Navbar.Toggle>
          <Navbar.Brand className="mr-auto" href="#">
          <Link to='home'>
          <img
              className="logoIcon"
              src={logo}
              alt="logo"
              style={{ width: 130 }}
            />
            </Link>           
          </Navbar.Brand>
          <Navbar.Collapse id="navbarScroll">
            <Nav
              className="ml-auto my-2 my-lg-0"
              style={{ maxHeight: "100px", marginRight: "5%" }}
              navbarScroll
            >
              <Nav.Link>
                <Link to='/motherboard' className="links">
                Motherboard
                </Link>
              </Nav.Link>
              <Nav.Link onClick={(e) => e.preventDefault()}>
                <Link to='/processor' className="links">
                Processor
                </Link>
              </Nav.Link>
              <Nav.Link>
              <Link to='/ram' className="links">
                RAM
                </Link>
              </Nav.Link>
              <Nav.Link>
              <Link to='/hdd' className="links">
                HDD
                </Link>
              </Nav.Link>
              <Nav.Link>
              <Link to='/graphic' className="links">
                Cabinet
                </Link>
              </Nav.Link>
            </Nav>
          </Navbar.Collapse>
          <Form className="d-flex" style={{ marginRight: "2%" }}> 
          <searchContext.Provider value={searchText}>
          <Motherboard></Motherboard>
          </searchContext.Provider>
            <FormControl
              type="search"
              placeholder="Search"
              onChange={event => {setSearchText(event.target.value)}}
              className="mr-2"
              aria-label="Search"
              style={{background:'transparent', borderRadius:0, color:'white'}}
            />
          </Form>

现在,我尝试使用我的useContext,并在Motherboard组件中调用useStatesearchText。但是在运行时会遇到一些undefined错误。

Motherboard.js

代码语言:javascript
运行
复制
import {searchContext} from '../context'

const dummy = Array.from(Array(10));

function Motherboard(props) {
  let context = useContext(searchContext);

  const [loading, setLoading] = React.useState(true);
  // const [products, setProducts] = React.useState([]);

  const products = useSelector((state) => state.products);
  const dispatch = useDispatch();

  useEffect(() => {
    axios
      .post("/product?limit=50&page=1&category=motherboard")
      .then((res) => {
        console.log(res, "res");
        dispatch({
          type: actionTypes.GET_PRODUCTS,
          payload: res.data.products,
        });
        setLoading(false);
      })
      .catch((err) => {
        setLoading(false);
        console.log(err);
      });
  }, []);

  const styleCol = {
    backgroundColor: "#0F0F13",
  };

  if (loading) {
    return (
      <div className='loadDiv'>
        <ClipLoader size="150" color="white" style={{marginTop: -200}}/>
      </div>
    );
  }

  return (
    <div className="filterDiv">
      <Banner />
      <Container fluid="md">
        <Row>
          <Col lg={3} style={styleCol} className="colFilter">
            <div>
              <div style={{ backgroundColor: "#191C27" }}>
                <Accordion>
                  <AccordionSummary
                    aria-controls="panel1a-content"
                    id="panel1a-header"
                  >
                    <Typography>SORT BY PRICE</Typography>
                  </AccordionSummary>
                  <div className="filterDiv">
                    <AccordionDetails>
                      <FormControl component="fieldset">
                        <RadioGroup aria-label="gender" name="gender1">
                          <FormControlLabel
                            value="hightolow"
                            control={<Radio />}
                            label="Highest to Lowest"
                            className="radioBtn"
                          />
                          <FormControlLabel
                            value="lowtohigh"
                            control={<Radio />}
                            label="Lowest to Highest"
                            className="radioBtn"
                          />
                        </RadioGroup>
                      </FormControl>
                    </AccordionDetails>
                  </div>
                </Accordion>
              </div>
              <div style={{ backgroundColor: "#191C27" }}>
                <Accordion>
                  <AccordionSummary
                    aria-controls="panel1a-content"
                    id="panel1a-header"
                  >
                    <Typography className="heading">SUB CATEGORY</Typography>
                  </AccordionSummary>
                  <div className="filterDiv">
                    <AccordionDetails>
                      <FormControl component="fieldset">
                        <RadioGroup aria-label="processor" name="prcocessor">
                          <FormControlLabel
                            value="hightolow"
                            control={<Radio />}
                            label="INTEL"
                            className="radioBtn"
                          />
                          <FormControlLabel
                            value="lowtohigh"
                            control={<Radio />}
                            label="AMD"
                            className="radioBtn"
                          />
                        </RadioGroup>
                      </FormControl>
                    </AccordionDetails>
                  </div>
                </Accordion>
              </div>
            </div>
          </Col>
          <Col
            xs={12}
            lg={9}
            sm={12}
            md={12}
            style={{ backgroundColor: "#0F0F13", paddingTop: 27 }}
          >
            <Row>
              {products.filter((product) => {
                  if(context.searchText == '') {
                    return product
                  }
                  else if(product.productName.toLowerCase.includes(context.searchText.toLowerCase())){
                    return product
                  }}).map((product, index) => {
               return (
                  <Col key={index} lg={4} md={6} xs={12} sm={6}>
                    <div
EN

回答 3

Stack Overflow用户

发布于 2021-07-17 16:29:04

在编写context.searchText时,您必须在provider的值中存储一个对象:

代码语言:javascript
运行
复制
<searchContext.Provider value={{ searchText }}>
  <Motherboard />
</searchContext.Provider>
票数 2
EN

Stack Overflow用户

发布于 2021-07-17 16:28:09

您可以尝试将值定义为对象。错误可能是由于值不是对象造成的

代码语言:javascript
运行
复制
<searchContext.Provider value={{ searchText }}>
  <Motherboard></Motherboard>
</searchContext.Provider>
票数 1
EN

Stack Overflow用户

发布于 2021-07-17 17:11:46

在MotherBoard.js中使用context而不是context.searchText,因为您在provider中传递了一个字符串作为值,因此当使用useContext调用context时,它会给出您在搜索框中键入的provider的最新值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68418708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档