【问题标题】:Pass usestate array between sibling components in React在 React 中的兄弟组件之间传递 usestate 数组
【发布时间】:2021-12-26 16:40:31
【问题描述】:

我正在构建一个包含地图和侧边选项卡的应用程序。

每次用户点击地图时,都会出现一个标记,并且坐标存储在使用的状态数组中。

我希望每次出现新标记时都在我的侧选项卡中将其显示为列表或手风琴项。

我的侧选项卡组件和我的addmarker 组件将应用程序作为父级。

每次点击地图时,如何将usestate 数组从我的addmarker 组件传递到我的侧边栏组件?

添加标记组件

function AddMarker(callbackFunction){
  const [coord, setPosition] = useState([]);



const map = useMapEvents({
    click: (e) => { 
       
        setPosition([...coord,e.latlng])
        const mark = e

        //console.log(mark)
        //setInfo(`${e.latlng}`)
        
     },

侧边栏组件

export default function VerticalTabs() {
const [value, setValue] = React.useState(0);

const handleChange = (event, newValue) => {
setValue(newValue);
};

return (
<Box
  sx={{ flexGrow: 1, bgcolor: 'background.paper', display: 'flex', height: 224 }}
>
  <Tabs
    orientation="vertical"
    value={value}
    onChange={handleChange}
    aria-label="Vertical tabs"
    sx={{ borderRight: 1, borderColor: 'divider' }}
  >
    <Tab label="Waypoints" {...a11yProps(0)} />
    <Tab label="Sorting" {...a11yProps(1)} />
 
  </Tabs>
  <TabPanel value={value} index={0}>
   
  </TabPanel>
  <TabPanel value={value} index={1}>
    Sorting
  </TabPanel>

</Box>

 );
}

APP.JS

function App() {
    return (
      <div className="App" >
        
             <Sidetabs/>

            <MapContainer center={[40.44695, -345.23437]} zoom={3}>

           ..............
 
              <AddMarker />
            </MapContainer>
          
    </div>
      )
}

【问题讨论】:

标签: reactjs components use-state


【解决方案1】:

在这里,总是提升一步,每次都有帮助,我已经提升了你的状态,现在两个孩子都可以使用它,https://reactjs.org/docs/lifting-state-up.html 类似的实现可能是这样的, 因为两个兄弟姐妹都只是父 App 的孩子

function App() {

    const [coord, setPosition] = useState([]);

    return (
      <div className="App" >
            <Sidetabs coord={coord} setPosition={setPosition}/>
            <MapContainer center={[40.44695, -345.23437]} zoom={3}>
            <AddMarker coord={coord} setPosition={setPosition}/>
            </MapContainer>
      </div>
      )
}

然后使用 props 提取出来,

function AddMarker(props){
   const {coord, setPosition} = props;
}

【讨论】:

  • 我认为你是对的!但是在我的返回方法中的 AddMarker 函数中,当我尝试通过坐标进行映射时,我得到 coord 未定义的错误 {coord.map((pos, idx) =>....
  • const [coord, setPosition] = useState([]);之前做coord &amp;&amp; coord.map((pos, idx) =&gt;{}它必须被填充写否则你传递空
  • 好的,谢谢它与 coord && coord.map 一起使用!但我们是这样吗?
  • 只有在有数据时才显示,并不总是,所以我们使用&&,如果仍然尝试在未定义时调用.filter()会抛出错误,所以我们确保它不是未定义的
  • @DianaSk 你介意投票回答吗,如果它对你有帮助,谢谢继续发帖
猜你喜欢
  • 2019-12-30
  • 2018-07-27
  • 1970-01-01
  • 2020-12-18
  • 2022-09-28
  • 2019-10-09
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多