【问题标题】:Change the display based on state from other component根据其他组件的状态更改显示
【发布时间】:2021-12-13 20:12:37
【问题描述】:

所以我有这个custom collapse,我根据这个const [disabled, setDisabled] = useState(true); 状态在两种显示风格之间切换。然后我在另一个组件上使用这个custom collapse,在我单击一个按钮后,我会想要更改为另一种显示样式,即3rd style of display。我究竟如何获得状态然后在原始组件上更改它?
这是 ./CustomCollapse.js

中的自定义折叠
const CustomCollapse = (props) => {
  const [disabled, setDisabled] = useState(true);
  return (
    <StyledCollapse onChange={() => setDisabled(prev => !prev)}>
      <AntCollapse.Panel
        header={props.header}
        key="1"
        showArrow={false}
        bordered={false}
        extra={
          <span>
            <span style={{ color: "#0076de", float: "right" }}>
            // Here's where I wanna add the 3rd style
              {disabled ? <div id={styles.themeBox}><p>+10</p></div> : <img src={arrowDownIcon} alt="" style={{height:'1.2em', marginLRight:'10px', width:'auto', objectFit:'contain'}} />}
            </span>
          </span>
        }
      >
        {props.children}
      </AntCollapse.Panel>
    </StyledCollapse>
  );
};

这里是我想在 ./FollowTelegram.js 中更改状态的地方:

import AntCollapse from './CustomCollapse';

  let [followed, setFollowed] = useState(false);
  const setFollowed = () => {
    setFollowed(prev => !prev)
  } 
// {...other code}

<AntCollapse id={styles.telegramHeader1} header="Follow XXX on Telegram Announcement Channel">
          <Row type='flex' align='middle' justify='center'>
            <Button href={links[0]} target="_blank" style={buttonStyle1} onClick={() => setClicked(false)}>
              <Icon type="link" style={{ color: '#fff' }} theme="outlined" />
              Subscribe
            </Button>
          </Row>
          <span className={styles.greyLine}> </span>
          <Row type='flex' align='middle' justify='center'>
           //Here's where I wanna change followed to true
            <Button onClick={setFollowed} style={buttonStyle2} disabled={clicked}>Continue</Button> 
            <Button type='text' style={{color:'#EB7B59', border:'#f7f7f7', background:'#f7f7f7',height: "2em", fontSize:'16px', margin:'10px 0 0 10px'}}>Cancel</Button>
          </Row>
        </AntCollapse>

但是如何将状态传递给 ./CustomCollapse 以了解和更改样式?

【问题讨论】:

  • 我看不到你在另一个组件中使用了 CustomCollapse!!
  • 请保持原样,不要使用答案来更新它,以免混淆其他想要回答的人,除非您有要添加的额外详细信息。或提及您已更新问题。

标签: reactjs react-hooks antd


【解决方案1】:

您可以通过添加属性将禁用的值传递给子组件(CustomCollapse)。

import React, { useState, useEffect } from 'react'

const CustomCollapse = (props) => {
    const [disabled, setDisabled] = useState(true);

    useEffect(() => {
        setDisabled(props.isDisabled)
    }, [props.isDisabled])

    return (
        <StyledCollapse onChange={() => setDisabled(prev => !prev)}>
            <AntCollapse.Panel
                header={props.header}
                key="1"
                showArrow={false}
                bordered={false}
                extra={
                    <span>
                        <span style={{ color: "#0076de", float: "right" }}>
                            // Here's where I wanna add the 3rd style
                            {disabled ? <div id={styles.themeBox}><p>+10</p></div> : <img src={arrowDownIcon} alt="" style={{ height: '1.2em', marginLRight: '10px', width: 'auto', objectFit: 'contain', float: 'left' }} />}
                        </span>
                    </span>
                }
            >
                {props.children}
            </AntCollapse.Panel>
        </StyledCollapse>
    );
};

在父组件中

import AntCollapse from './CustomCollapse';

    //inside your parent component

    let [followed, setFollowed] = useState(false);
    const [disabledCollapse, setDisabledCollapse] = useState(true)
    // {...other code}
    const toggleDisabledCollapse = () => {
        setDisabledCollapse(prev => !prev)
    }
    return <AntCollapse isDisabled={disabledCollapse}  id={styles.telegramHeader1} header="Follow XXX on Telegram Announcement Channel">
        <Row type='flex' align='middle' justify='center'>
            <Button href={links[0]} target="_blank" style={buttonStyle1} onClick={() => setClicked(false)}>
                <Icon type="link" style={{ color: '#fff' }} theme="outlined" />
                Subscribe
            </Button>
        </Row>
        <span className={styles.greyLine}> </span>
        <Row type='flex' align='middle' justify='center'>
               //Here's where I wanna change followed to true
            <Button onClick={toggleDisabledCollapse} href={links[0]} target="_blank" style={buttonStyle2} disabled={clicked}>Continue</Button>
            <Button type='text' style={{ color: '#EB7B59', border: '#f7f7f7', background: '#f7f7f7', height: "2em", fontSize: '16px', margin: '10px 0 0 10px' }}>Cancel</Button>
        </Row>
    </AntCollapse>

【讨论】:

  • 我刚刚更新了您刚刚包含的代码。但它不起作用。我在 ./FollowTelegram 中添加了 setFollowed ,而在 button 中,我想将 state: followed 发送到 ./CustomCollapse 。我该怎么做?另外,我是不是写在这一行:{followed ? &lt;div id={styles.themeBox}&gt;&lt;p&gt;+10&lt;/p&gt;&lt;/div&gt; : &lt;img src={tickIcon} alt="" style={{height:'1.2em', marginLRight:'10px', width:'auto', objectFit:'contain'}} /&gt;}
  • 您没有将 isFollowed 传递给父组件中的 AntCollapse。请再次检查我的代码。您需要在 AntCollapse 中传递 isFollowed ={followed}
  • 变成这样&lt;AntCollapse isFollowed={followed} id={styles.telegramHeader1} header="Follow XXX on Telegram Announcement Channel"&gt;
  • 谢谢,成功了!
  • 不客气,很高兴为您提供帮助。
猜你喜欢
  • 2020-06-16
  • 2017-11-27
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多