是否可以仅在初始化道具时才渲染反应组件?

Posted

技术标签:

【中文标题】是否可以仅在初始化道具时才渲染反应组件?【英文标题】:Is it possible to render a react component only when a prop is initialized? 【发布时间】:2020-07-06 02:50:19 【问题描述】:

我正在尝试将道具 search 传递给我的 AddressList 组件。

<div className="addresses">
                search && <AddressList onAddressSelect=addressSelectFunction
                                       addresses=app.addresses
                                       update=updateChild
                                       searchRef=searchRef
                                       search=search
                                       searchCompleteHandler=searchCompleteHandler/> 
            </div>

问题是,prop 在渲染过程中可能没有初始化。

useEffect(()=>
    loadModules(["esri/Map",
        "esri/views/MapView",
        "esri/Graphic",
        "esri/layers/GraphicsLayer",
        "esri/widgets/Search",
        "esri/tasks/Locator",
        "esri/geometry/Point",
        "esri/tasks/RouteTask",
        "esri/tasks/support/RouteParameters",
        "esri/tasks/support/FeatureSet",
        "esri/geometry/geometryEngine",
        "esri/geometry/support/webMercatorUtils"])
        .then(([Map, MapView, Graphic, GraphicsLayer, Search, Locator, Point, RouteTask, RouteParameters, FeatureSet, geometryEngine, webMercatorUtils]) => 
            //...initialize other stuff
            search = new Search(
                view: view,
                container: searchRef.current,
                sources: [
                    
                        locator: new Locator(url: "https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer"),
                        countryCode: "LTU",
                        name: "Custom Geocoding Service"
                    
                ],
                includeDefaultSources: false
//....);

是否可以让子组件AddressList只在search初始化时才渲染?

【问题讨论】:

如果您将search 属性添加为useEffect 挂钩的依赖项,它只会在该属性初始化或更新时运行。 我不明白。我在这里发布的所有代码都来自 Map 组件。搜索变量应该像下面的代码一样被初始化,然后像上面的代码一样作为道具传递给 AddressList 组件。问题是,useEffect 和 loadModules 之前和之后的所有代码都在 useEffect 和 loadModules 之前执行。这就是搜索变量未初始化并传递 null 的原因。有没有办法让程序在渲染子组件之前等待 prop 初始化? 【参考方案1】:

您需要重新渲染组件。

const [loaded, setLoaded] = useState(false);
useEffect(()=>
!loaded && loadModules(["esri/Map",
    "esri/views/MapView",
    "esri/Graphic",
    "esri/layers/GraphicsLayer",
    "esri/widgets/Search",
    "esri/tasks/Locator",
    "esri/geometry/Point",
    "esri/tasks/RouteTask",
    "esri/tasks/support/RouteParameters",
    "esri/tasks/support/FeatureSet",
    "esri/geometry/geometryEngine",
    "esri/geometry/support/webMercatorUtils"])
    .then(([Map, MapView, Graphic, GraphicsLayer, Search, Locator, Point, RouteTask, RouteParameters, FeatureSet, geometryEngine, webMercatorUtils]) => 
        //...initialize other stuff
        search = new Search(
            view: view,
            container: searchRef.current,
            sources: [
                
                    locator: new Locator(url: "https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer"),
                    countryCode: "LTU",
                    name: "Custom Geocoding Service"
                
            ],
            includeDefaultSources: false
            setLoaded(true)
//....);

【讨论】:

如果我重新渲染组件,地图也会重新渲染。在这种情况下,我无法重新渲染父组件 编辑了我的答案 很抱歉没有回复您。在投入大量工作试图让 arcgis 与 react 一起工作后,我放弃了并回到了普通的 javascript。这个问题可能太深了,无法在本网站上讨论。

以上是关于是否可以仅在初始化道具时才渲染反应组件?的主要内容,如果未能解决你的问题,请参考以下文章

在制作反应组件 es6 语法时,为啥用道具超级初始化? [复制]

仅在初始渲染后反应 CSS 动画

VueJS路由器查看反应道具未定义

为啥不能根据道具反应设置初始状态

更新道具时反应本机组件不透明度不更新

即使道具没有改变,为啥还要对重新渲染组件做出反应?