Javascript 高阶组件:默认道具
我有这段代码,并试图用react类包装一个HOC。首先,我想要覆盖默认参数的一部分。这是我的代码(您不需要阅读全部代码,问题是关于HOC中的defaultProps) 首先是组成部分:Javascript 高阶组件:默认道具,javascript,reactjs,higher-order-components,recompose,Javascript,Reactjs,Higher Order Components,Recompose,我有这段代码,并试图用react类包装一个HOC。首先,我想要覆盖默认参数的一部分。这是我的代码(您不需要阅读全部代码,问题是关于HOC中的defaultProps) 首先是组成部分: 从“React”导入React; //重组 从“重新组合/组合”导入组合; 从“重新组合/defaultProps”导入defaultProps; 使用状态从“重新组合/使用状态”导入; 从“重新组合/withHandlers”导入withHandlers; 从“重新组合/withProps”导入withProp
从“React”导入React;
//重组
从“重新组合/组合”导入组合;
从“重新组合/defaultProps”导入defaultProps;
使用状态从“重新组合/使用状态”导入;
从“重新组合/withHandlers”导入withHandlers;
从“重新组合/withProps”导入withProps;
//乌提尔斯
从'react css themr'导入{themr};
从“/utils/fakeData”导入{suslovkaCoords,generateMarkers};
//控制
从“./controls/Map”导入CanvasHoverMap;
从“./controls/Markers/HoveredTooltipMarker”导入HoveredTooltipMarker;
从“./controls/Markers/ToolTimparker”导入ToolTimparker;
//组成部分
从“../RoomTooltip/RoomTooltip”导入RoomTooltip;
//风格
从“/map.sass”导入样式;
从“./controls/Map/mapSytles”导入贴图样式;
常数=3000;
导出常量映射=({
主题
风格
选项,
马克距离,
标记,
渲染器,
渲染器,
mapParams:{
快速移动
居中
},
setMapParams,
安姆桑奇酒店,
精选营销员,
设置选定的Marker,
伊斯莫比尔,
刷新
}) => (
);
现在,特设委员会:
导出常量mapHOC=compose(
主题(“地图”,样式),
默认道具({
选项:{
滚轮:对,
动物控制:对,
ZoomControl选项:{
位置:1,//google.maps.ControlPosition.LEFT\u顶部
},
minZoom:3,
缩放:10,
maxZoom:18,
//禁用双击缩放:真,
样式:地图样式,
},
风格:{
弹性:1,
},
悬停距离:15,
标记距离:15,
标记:生成标记(标记计数,0.0003),
}),
带状态('mapParams','setMapParams',{center:suslovkaCoords,zoom:8}),
带状态('selectedMarker','setSelectedMarker',null),
withProps({selectedMarker})=>({
isSelected:(标记)=>selectedMarker
?selectedMarker.id==marker.id
:错,
})),
带处理器({
onmparamschange:({setMapParams})=>({center,zoom,bounds})=>{
setMapParams({中心,缩放,边界});
log('setMapParams',{center,zoom});
},
renderMarker:({theme,setSelectedMarker,isSelected,isMobile})=>(marker)=>{
常量ToolTimparkerProps={
关键字:marker.id,
主题:{theme},
主题空间:“工具提示标记器”,
初始规模:1,
默认比例:1,
悬停比例:1.3,
tooltipContent:,
填充偏移:10,//用于工具提示位置
ToolTipContentHight:240,//不需要精确,用于工具提示位置
tooltipContentWidth:200,//无需精确,用于工具提示位置
setSelectedMarker:setSelectedMarker,
已选:isSelected(标记),
马克:马克,
…标记,
};
返回isMobile
?
: ;
},
//确保当前实现中的标记是平铺标记,而不是所有标记。
//使用平铺是因为它允许此处未使用的某些性能优化
渲染标记:()=>({ctx,markers,tileSize})=>{
clearRect(0,0,tileSize,tileSize);
常数半径=5;
markers.forEach(({/*id,*/x,y})=>{
//这里只有圆圈,但可以是图像,使用id或其他标记道具进行渲染
ctx.fillStyle='rgba(0,0,0,0.1)';
ctx.beginPath();
ctx.弧(x,y,半径+3,0,数学PI*2,真);
ctx.closePath();
ctx.fill();
ctx.fillStyle='白色';
ctx.beginPath();
ctx.弧(x,y,半径+2,0,数学π*2,真);
ctx.closePath();
ctx.fill();
ctx.fillStyle='#00b92a';
ctx.beginPath();
弧(x,y,半径,0,数学π*2,真);
ctx.closePath();
ctx.fill();
});
},
}),
);
我想从defaultProps中删除“markers:generateMarkers(markers\u COUNT,0.0003)”并从外部提供标记
到目前为止,我尝试的是:
const newmap=mapHOC(map);
类MapWithState扩展了React.Component{
建造师(道具){
超级(道具);
}
render(){
常量标记=生成标记(标记计数,0.0003);
返回();
}
}
导出默认MapWithState;
//导出默认的mapHOC(map);
你知道怎么做吗?我希望这件事能顺利完成。谢谢 在创建组件时反应合并道具 也就是说,当一个组件(JSX)被实例化时,它会为其创建一个公共数据和私有数据,即分别为state和props 当为组件创建道具时,它将获取所有参数道具(来自被调用方),并考虑是否在该类中声明了任何可以填充的默认道具 类似于
Object.assign({},{…defaultProps},{…userProps})
其中,defaultProps
将被userProps
覆盖。如果userProps
不可用,则将考虑defaultProps
因此,在您的情况下,您需要删除一个默认道具,
这应该会起作用。非常感谢。这就是我想做的。第一次不起作用,但第二次尝试后,一切都很好。甚至没有必要删除默认的道具!