我在下面的‘导航栏’的<Link>组件中有一个Select组件:

const Navbar = (props) => {

    return (
        <Link to='/'>
            <div className='navbar'>

                <img src={logo} className="App-logo" alt="App Name"/>
                <h1 className='app_name'>My App Name</h1>
                <BaseCurrencySelect baseCurrency={props.baseCurrency} stateChanger={props.stateChanger}/>
            </div>
        </Link>
    )
}

下面是我的BaseCurrencySelect个组成部分:

export default function BaseCurrencySelect(props) {

    const [baseCurrency, setBaseCurrency] = React.useState(props.baseCurrency);

    const handleChange = (event) => {
        let selectedCurrency = CurrencyUtils.getCurrencyFromId(event.target.value)
        setBaseCurrency(selectedCurrency);
        props.stateChanger(selectedCurrency);
    };

    return (
        <Box className="MuiSelect-box" sx={{minWidth: 50}}>
            <FormControl fullWidth>
                <Select
                    className="MuiSelect-select"
                    labelId="currency-select-label"
                    id="currency-select"
                    value={baseCurrency.id}
                    onChange={handleChange}
                >
                    <MenuItem value={CurrencyUtils.currencies.EUR.id}>EUR</MenuItem>
                    <MenuItem value={CurrencyUtils.currencies.USD.id}>USD</MenuItem>
                    <MenuItem value={CurrencyUtils.currencies.BTC.id}>BTC</MenuItem>
                    <MenuItem value={CurrencyUtils.currencies.ETH.id}>ETH</MenuItem>
                </Select>
            </FormControl>
        </Box>
    );
}

问题是,当用户从Select组件中 Select 一项时,它的行为就像用户已经点击了导航栏中的Link,因此将用户重定向到Linktoprops ,即‘/’.

相反,我希望用户在与Select组件交互后留在当前路由上,并且只呼叫stateChanger.

如何落实这一点?

推荐答案

您不应该将交互式DOM元素嵌套在其他交互式DOM元素中.您可以通过停止传播select元素中的Click事件来修复这个问题,即防止事件冒泡到link元素,但这仍然会导致糟糕的UI.

如果只需要呈现Navbar中的BaseCurrencySelect组件和链接,那么一个简单的解决方案是取消嵌套BaseCurrencySelect,并将其呈现为任何链接的sibling 组件.

示例:

const Navbar = ({ baseCurrency, stateChanger }) => {
  return (
    <div className='navbar'>
      <Link to='/'>
        <img src={logo} className="App-logo" alt="App Name" />
        <h1 className='app_name'>My App Name</h1>
      </Link>

      <BaseCurrencySelect
        baseCurrency={baseCurrency}
        stateChanger={stateChanger}
      />            
    </div>
  );
};

Reactjs相关问答推荐

无法使用#13;或br将新行设置为文本区域'"&"<>

在Reaction中测试条件组件

导致useState中断的中断模式

Redux Store未触发React组件中的重新呈现

Reaction中的数据加载不一致

在transformResponse中使用来自其他查询的缓存

页面永远加载API/从数据库获取数据

useRef()的钩子调用无效

在迭代状态时无法读取未定义的属性(读取 map )

错误:操作必须是普通对象.使用自定义中间件进行异步操作. Redux/工具包

尽管所有页面在 Reactjs 中都是公开的,但始终导航到特定页面

如何根据ReactJS中元素列表中的布尔值仅显示一次值

如何在不使用 Axios 的情况下将图像文件从 React.js 发送到 Spring Boot Rest API?

我正在try 将一组加载程序函数发送到我的路由,它抛出一个错误 Handler is not a funtion in a reactJs application

Cypress - 替换 React 项目中的变量

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

是什么导致了这个令人惊讶的数组导致 React

如何从 extrareducer redux 更改对象中元素的值

MUI 卡组件上的文本未正确对齐

useEffect 仅在跟随链接后有效,不适用于直接链接