Передача реквизита компоненту внутри компонента более высокого порядка - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь понять, как передать реквизит компоненту, который упакован компонентом более высокого порядка. У меня есть компонент высшего порядка, записанный так:

import React from 'react'

function withAuth(Layer){

   return class AuthenticatedHOC extends React.Component{

      componentDidMount(){
         if (!this.props.token){
            authenticateEsri()
         } 
      }

      render(){
         return (
            <>
               {this.props.token && <Layer {...this.props} />}
            </>
         )
      }

   }

}

const mapStateToProps = state => ({
   token: state.data.layers.esri.access_token
})

export default compose(
   connect(mapStateToProps),
   withAuth
)

Довольно просто. HO C проверяет, находится ли токен аутентификации в хранилище приставок. Если это не так, он вызывает API, чтобы получить токен. Оказавшись там, он рендерит обернутый компонент с токеном аутентификации как реквизит. Средний компонент, который используется в качестве аргумента в этом HO C, выглядит следующим образом:

import { withLeaflet, MapControl } from "react-leaflet";
import * as EsriLeaflet from "esri-leaflet";
import withEsriAuth from './withAuth'

class Layer extends MapControl {
   createLeafletElement(props) {
      const layer = EsriLeaflet[props.layerType]({
         ...props
      })
      return layer;
   }

   componentDidMount() {
      const { map } = this.props.leaflet;
      this.leafletElement.addTo(map);
   }
}

export default withEsriAuth(withLeaflet(Layer))

Некоторые слои требуют токен авторизации, а некоторые нет. Передача токена слою, который не требует его, вызывает ошибку, равно как и передача токена слою, для которого он не требуется. То, что я хочу сделать, это отделить withEsriAuth от EsriLeafletLayer компонента. Вместо того, чтобы EsriLeafletLayer каждый раз заключать в withEsriAuth, я хочу иметь возможность решить, использовать ли аутентификацию HO C каждый раз, когда я объявляю Layer. В нынешнем виде я могу объявить компонент следующим образом:

<Layer url="somelayerurl.com" opacity={0.5} />

И он будет каждый раз запускать аутентификацию. Я предпочел бы export default withLeaflet(Layer), а затем объявить что-то вроде этого:

withAuth( <Layer url="somelayerurl.com" opacity={0.5} /> )

Однако это не работает - это говорит мне, что функция не является допустимым дочерним элементом реагировать. Я знаю, что с этим синтаксисом что-то выглядит странно, и что должен быть более правильный способ написать это.

Спасибо за чтение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...