javascript coffeescript reactjs parent-child react-router

javascript - Pasando props a rutas Reaccionar niños enrutadores



coffeescript reactjs (3)

En componente de niño, insted de

return <div>{this.props.children}</div>

Puede fusionar accesorios con el padre

var childrenWithProps = React.cloneElement(this.props.children, this.props); return <div>{childrenWithProps}</div>

Tengo problemas para solucionar un problema con el enrutador de reacción. El escenario es que necesito pasarles a los niños un conjunto de accesorios de un componente y ruta principal del estado.
lo que me gustaría hacer es pasar a childRouteA su propsA , y pasar childRouteB its propsB . Sin embargo, la única manera en que puedo descubrir cómo hacer esto es pasarle a RouteHandler tanto propsA como propsB que significa que cada ruta de niño hace que cada niño propile independientemente de si es relevante. esto no es un problema de bloqueo en este momento, pero puedo ver un momento en el que usaría los dos del mismo componente, lo que significa que las teclas en propA serán sobrescritas por las teclas con las teclas de propB.

# routes routes = ( <Route name=''filter'' handler={ Parent } > <Route name=''price'' handler={ Child1 } /> <Route name=''time'' handler={ Child2 } /> </Route> ) # Parent component render: -> <div> <RouteHandler {...@allProps()} /> </div> timeProps: -> foo: ''bar'' priceProps: -> baz: ''qux'' # assign = require ''object-assign'' allProps: -> assign {}, timeProps(), priceProps()

Esto realmente funciona de la manera en que lo espero. Cuando me enlace a /filters/time obtengo el componente Child2 prestado. Cuando voy a /filters/price obtengo el componente Child1 prestado. el problema es que al hacer este proceso, Child1 y Child2 son pasados allProps() a pesar de que solo necesitan accesorios de precio y tiempo, respectivamente. Esto puede convertirse en un problema si esos dos componentes tienen un nombre de apoyo idéntico y, en general, no es una buena práctica para hinchar los componentes con accesorios innecesarios (ya que hay más de 2 niños en mi caso real).
RouteHandler , en resumen , ¿hay alguna manera de pasar RouteHandler timeProps cuando voy a la ruta del tiempo ( filters/time ) y solo paso priceProps a RouteHandler cuando voy a la ruta del precio ( filters/price ) y evito pasar todos los accesorios a todos rutas de niños?


Me encontré con un problema similar y descubrí que puede acceder a los accesorios establecidos en la Route través de this.props.route en su componente de ruta. Sabiendo esto, organicé mis componentes así:

index.js

React.render(( <Router history={new HashHistory()}> <Route component={App}> <Route path="/hello" name="hello" component={views.HelloView} fruits={[''orange'', ''banana'', ''grape'']} /> </Route> </Router> ), document.getElementById(''app''));

App.js

class App extends React.Component { constructor(props) { super(props); } render() { return <div>{this.props.children}</div>; } }

HelloView.js

class HelloView extends React.Component { constructor(props) { super(props); } render() { return <div> <ul> {this.props.route.fruits.map(fruit => <li key={fruit}>{fruit}</li> )} </ul> </div>; } }

Esto está usando react-router v1.0-beta3. ¡Espero que esto ayude!

Bien, ahora que estoy entendiendo mejor tu problema, esto es lo que podrías intentar.

Debido a que los accesorios de su hijo proceden de un padre soltero, su componente principal, no el enrutador de reacción, debe ser el que maneja el niño que se renderiza para que pueda controlar qué atrezzo se pasa.

Puede intentar cambiar su ruta para usar un parámetro, luego inspeccionar ese parámetro en su componente principal para representar el componente secundario apropiado.

Ruta

<Route name="filter" path="filter/:name" handler={Parent} />

Componente principal

render: function () { if (this.props.params.name === ''price'') { return <Child1 {...this.getPriceProps()} /> } else if (this.props.params.name === ''time'') { return <Child2 {...this.getTimeProps()} /> } else { // something else } }


React.cloneElement se puede utilizar para representar el componente secundario y para pasar cualquier dato disponible dentro del componente de ruta hijo que se define en la ruta.

Por ejemplo, aquí estoy pasando el valor del usuario al componente reaccionar childRoute.

{React.cloneElement(this.props.childRoute, { user: this.props.user })}