我在 React child 组件中的函数参数没有传递给 parent 组件的函数。为什么会这样?
Parameters of my function in React child component are not being passed to the parent component's function. Why is this happening?
在parent中:
const [newPinPosition, setNewPinPosition] = React.useState({ lat: 0 , lng: 0 });
const updateNewPinPos = (pos) => {
console.log(pos);
setNewPinPosition({ lat: pos.lat, lng: pos.lng });
};
// in the render method of the parent react component
<Draggable
draggable={draggable}
newPinPosition={newPinPosition}
setCenterPos={() => { getCurrentCenter(map); }}
updatePos={() => { updateNewPinPos(newPinPosition); }}
/>
在child中:
const updatePosition = useCallback(() => {
const marker = markerRef.current;
// console.log(`marker._latlng : ${marker._latlng}`);
props.updatePos(marker._latlng);
});
<StyledMarker
position={props.newPinPosition}
draggable={props.draggable}
ref={markerRef}
eventHandlers={{
dragend: () => {updatePosition();},
}}
>
我正在使用 React Leaflet 渲染世界地图。我正在尝试更新 dragend 事件上可拖动标记的状态(位置 object)。
当 dragend 触发时,updatePos 也会触发(它应该)并调用 props.updatePos(它应该)。
问题是这样的:在 child 的 console.log 中,我有标记的 object 位置。这是预期的正确行为。在 parent 组件中,正在调用 updateNewPinPos 函数,但 pos 参数为空 object。即使我使用 marker._latlang object 调用该函数,也会发生这种情况。为什么会这样? object 是如何在 child 和 parent 之间“丢失”的?
我对反应很陌生,所以如果这是非常基本的,我深表歉意,但我为此苦苦挣扎。如有必要,我可以提供更多信息。
您没有使用 useCallback
的依赖数组
useCallback
钩子的第二个参数是它的依赖数组,你应该把你在 useCallback
函数中使用的任何东西放在那里。只要依赖相同,React 就会缓存你的函数。
我建议在这种情况下不要使用 useCallback
。但如果你仍然想要,你应该这样做:
const updatePosition = useCallback(() => {
const marker = markerRef.current;
props.updatePos(marker._latlng);
}, [props.updatePos]);
同样在你的父组件中,你应该使用给定的参数,或者直接传递函数,像这样:
<Draggable
draggable={draggable}
newPinPosition={newPinPosition}
setCenterPos={() => { getCurrentCenter(map); }}
updatePos={updateNewPinPos}
/>
在parent中:
const [newPinPosition, setNewPinPosition] = React.useState({ lat: 0 , lng: 0 });
const updateNewPinPos = (pos) => {
console.log(pos);
setNewPinPosition({ lat: pos.lat, lng: pos.lng });
};
// in the render method of the parent react component
<Draggable
draggable={draggable}
newPinPosition={newPinPosition}
setCenterPos={() => { getCurrentCenter(map); }}
updatePos={() => { updateNewPinPos(newPinPosition); }}
/>
在child中:
const updatePosition = useCallback(() => {
const marker = markerRef.current;
// console.log(`marker._latlng : ${marker._latlng}`);
props.updatePos(marker._latlng);
});
<StyledMarker
position={props.newPinPosition}
draggable={props.draggable}
ref={markerRef}
eventHandlers={{
dragend: () => {updatePosition();},
}}
>
我正在使用 React Leaflet 渲染世界地图。我正在尝试更新 dragend 事件上可拖动标记的状态(位置 object)。
当 dragend 触发时,updatePos 也会触发(它应该)并调用 props.updatePos(它应该)。
问题是这样的:在 child 的 console.log 中,我有标记的 object 位置。这是预期的正确行为。在 parent 组件中,正在调用 updateNewPinPos 函数,但 pos 参数为空 object。即使我使用 marker._latlang object 调用该函数,也会发生这种情况。为什么会这样? object 是如何在 child 和 parent 之间“丢失”的?
我对反应很陌生,所以如果这是非常基本的,我深表歉意,但我为此苦苦挣扎。如有必要,我可以提供更多信息。
您没有使用 useCallback
useCallback
钩子的第二个参数是它的依赖数组,你应该把你在 useCallback
函数中使用的任何东西放在那里。只要依赖相同,React 就会缓存你的函数。
我建议在这种情况下不要使用 useCallback
。但如果你仍然想要,你应该这样做:
const updatePosition = useCallback(() => {
const marker = markerRef.current;
props.updatePos(marker._latlng);
}, [props.updatePos]);
同样在你的父组件中,你应该使用给定的参数,或者直接传递函数,像这样:
<Draggable
draggable={draggable}
newPinPosition={newPinPosition}
setCenterPos={() => { getCurrentCenter(map); }}
updatePos={updateNewPinPos}
/>