2015-09-21 4 views
0

Я знаю, что это довольно недокументированная функция, но так как react-router не имеет чистого способа передачи реквизитов дочерним компонентам маршрута, я хотел использовать контекст.Использование React contextTypes с реактивным маршрутизатором

<Router history={history}> 
    <Route component={Application} path="/(:id)"> 
     <IndexRoute component={EditDocument} /> 
    </Route> 
</Router> 

class Application extends Component { 

    static childContextTypes = { 
     charts: PT.array.isRequired, 
    } 

    getChildContext() { 
     return { charts: this.getCharts() }; 
    } 

    render() { 
     return <div>{this.props.children}</div> 
    } 
} 

class EditDocument extends Component { 

    static contextTypes = { 
     charts: PT.array.isRequired, 
    } 

    componentWillMount() { 
     this.context.charts === undefined 
    } 
} 

Я использую React 0.13 пока. Можно ли это решить, используя 0,14?

+0

Это может быть стоит посмотреть на этих вопросах, [реагировать-маршрутизатор # 1857] (https://github.com/rackt/response-router/issues/1857 # issuecomment-139228924) и [response-router # 1531] (https://github.com/rackt/react-router/issues/1531) – knowbody

ответ

-1

Вы можете попробовать {React.cloneElement (this.props.children, {someExtraProp: что-то})}

Так вы передаете дополнительный материал к представлениям

например

function renderApp(data) { 

var React = require('react'); 
var ReactRouter = require('react-router'); 
var Router = ReactRouter.Router; 

var App = React.createClass({ 

render: function() { 

    return (

<AppShell> 

     {React.cloneElement(this.props.children, {data:data})} 

    </AppShell> 
); 
} 
}); 

var rootRoute = { 
component: 'div', 
childRoutes: [{ 
path: '/', 
component: {App}, 
///etc 
}] 
}; 

React.render(

React.render (

<Router routes={rootRoute}/>, 
document.body 

);

, 
document.body 
); 

} 
renderApp(data); 

Надежда that полезно, дайте мне знать, если мне нужно, чтобы объяснить это лучше

+0

Да, я узнал о cloneElement в другом месте. Он работает лучше всего. Я просто не чувствую, что это «чистое» решение. – FredyC

0

Вы можете использовать Реагировать маршрутизатор createElement

Вы можете легко настроить его, чтобы выборочно передать реквизит от состояния маршрутизатора или приложений состояния к компонентам маршрута (на основе маршрута конфигурации, если вы хотите).

+0

Да, я видел, что , но я все еще не могу указать, как это использовать. Вы не можете получить доступ к родительским реквизитам в этой функции. – FredyC

1

Чтобы передать реквизит компонента переопределить createElement метод Router перед созданием Router:

const createElement = function(Component, props) { 
    return <Component {...props} myProps={{your: 'props'}} />; 
}; 

<Router history={history} createElement={createElement}> 
    <Route component={Application} path="/(:id)"> 
     <IndexRoute component={EditDocument} /> 
    </Route> 
</Router> 

Этот метод работает для нас. То же самое можно сделать на сервере с RoutingContext.

+0

Тот же ответ, что и @knowbody, поэтому тот же ответ. У меня нет доступа к запрошенным реквизитам при создании Router. Они в основном создаются в компоненте Application. Используя 'createElement', я не могу получить к ним доступ. – FredyC

+0

Хорошо, теперь я понимаю, что вы имеете в виду. Странно, что наше приложение настроено именно так, как ваш код, и он работает. Что отличает то, что мы используем наш собственный элемент createElement, и мы используем реакцию 0.14-rc1. –

Смежные вопросы