Я хочу отправлять отфильтрованные данные о продуктах другому компоненту в React при срабатывании переключателей?

#javascript #html #reactjs #react-native

#javascript #HTML #reactjs #react-native

Вопрос:

это мой компонент фильтра, в котором я извлекаю определенные продукты на основе значения radio и устанавливаю его в соответствии со своим состоянием.

 const [products, setProducts] = useState(null);

  const handleOnChange = (e) => {
    axios.get(`/store?limit=4amp;skip=0amp;sortBy=price:ascamp;subcategory=${e.currentTarget.value}`)
    .then(response => {
      setProducts(response.data)
    })
  }
  
  return (
    <>
      <Accordion defaultActiveKey='0' style={{ paddingBottom: 16 }}>
        <Card id='CCFilterCard'>
          <Accordion.Toggle id='CCFilterHeader' as={Card.Header} eventKey='0'>
            SUB CATEGORY
          </Accordion.Toggle>
          <Accordion.Collapse eventKey='0'>
            <Card.Body>
              <label className='radioContainer'>
                <input onChange={handleOnChange} type='radio' value='gaming' id='radioInput' />
                <span className='radiomark'></span>
                Gaming Laptops
              </label>
            </Card.Body>
          </Accordion.Toggle>
       </Card>
     </Accordion>
   </>
  

В этом компоненте продукта я извлекаю все продукты и устанавливаю их в свое состояние.

Что мне нужно, так это то, что я хочу заменить все продукты отфильтрованными данными о продуктах для этого компонента.

 export default class ProductCard extends Component {
  state = {
    loading:true,
    products:null,
    click:4
  }

  componentDidMount(){
    axios.get('/store?limit=4amp;skip=0amp;sortBy=price:ascamp;category=laptop')
    .then(response => {
      this.setState({loading:true});
      this.setState({products:response.data});
      this.setState({loading:false});
    })
  }
if(this.state.loading){
   return <h1>Loading...</h1>
}

 return (
      <React.Fragment>
        <Row>
          {
            this.state.products.map( product => {
              return (
                <Col
                  lg={4}
                  md={4}
                  sm={6}
                  xs={6}
                  style={{ paddingBottom: 24, marginTop: "20px" }}>
                  <NavLink to={'/container/productdetails/'   product._id}>
                    <Card id='stackBottom'/>
                    <Card id='displayCard'>
                      <Col style={{ textAlign: "center" }}>
                        <motion.div
                          whileHover={{ scale: 1.04 }}
                          whileTap={{ scale: 0.9 }}>
                          <Image
                            src={require("./laptopImages/legion.png")}
                            style={{ marginTop: "-21px" }}
                            id='productImage'
                          />
                        </motion.div>
                      </Col>
                      <Card.Body>
                        <Card.Text id='productTitle' className='module line-clamp'>
                          {product.productName}
                        </Card.Text>     
                      </Card.Body>
                    </Card>
                  </NavLink>
                </Col>
           </Row>
        </React.Fragment>
              )
            })
          }
  

Мне действительно понадобилась бы ваша помощь! заранее спасибо 🙂

Ответ №1:

Один из способов этого — использовать redux в вашем проекте и иметь центральное состояние продукта.таким образом, когда вы обновляете данные о продукте в компоненте filter, они также будут автоматически обновлены для компонента products. Вы можете настроить redux в своем проекте React native, используя эту ссылкуhttps://hub.packtpub.com/how-get-started-redux-react-native /

и после настройки redux ваш код будет выглядеть примерно так

 const products = useSelector((state) => state.products);
const dispatch = useDispatch()
  const handleOnChange = (e) => {
    axios.get(`/store?limit=4amp;skip=0amp;sortBy=price:ascamp;subcategory=${e.currentTarget.value}`)
    .then(response => {
      dispatch(setProducts(response.data))
    })
  }
  
  return (
    <>
      <Accordion defaultActiveKey='0' style={{ paddingBottom: 16 }}>
        <Card id='CCFilterCard'>
          <Accordion.Toggle id='CCFilterHeader' as={Card.Header} eventKey='0'>
            SUB CATEGORY
          </Accordion.Toggle>
          <Accordion.Collapse eventKey='0'>
            <Card.Body>
              <label className='radioContainer'>
                <input onChange={handleOnChange} type='radio' value='gaming' id='radioInput' />
                <span className='radiomark'></span>
                Gaming Laptops
              </label>
            </Card.Body>
          </Accordion.Toggle>
       </Card>
     </Accordion>
   </>  

и ваш компонент продукта был бы чем-то вроде этого

 export default class ProductCard extends Component {
  state = {
    loading:true,
    click:4
  }
const products = useSelector((state) => state.products);
const dispatch = useDispatch();
  componentDidMount(){
    axios.get('/store?limit=4amp;skip=0amp;sortBy=price:ascamp;category=laptop')
    .then(response => {
      this.setState({loading:true});
      dispatch(setProducts(response.data))
      this.setState({loading:false});
    })
  }
if(this.state.loading){
   return <h1>Loading...</h1>
}

 return (
      <React.Fragment>
        <Row>
          {
            this.state.products.map( product => {
              return (
                <Col
                  lg={4}
                  md={4}
                  sm={6}
                  xs={6}
                  style={{ paddingBottom: 24, marginTop: "20px" }}>
                  <NavLink to={'/container/productdetails/'   product._id}>
                    <Card id='stackBottom'/>
                    <Card id='displayCard'>
                      <Col style={{ textAlign: "center" }}>
                        <motion.div
                          whileHover={{ scale: 1.04 }}
                          whileTap={{ scale: 0.9 }}>
                          <Image
                            src={require("./laptopImages/legion.png")}
                            style={{ marginTop: "-21px" }}
                            id='productImage'
                          />
                        </motion.div>
                      </Col>
                      <Card.Body>
                        <Card.Text id='productTitle' className='module line-clamp'>
                          {product.productName}
                        </Card.Text>     
                      </Card.Body>
                    </Card>
                  </NavLink>
                </Col>
           </Row>
        </React.Fragment>
              )
            })
          }