2016-02-02 1 views
4

В моем классе компонентов у меня есть this.props, который содержит history объект, который содержит transitionTo функции.response redux pass this.props для действий от компонента

render() { 
    console.log(this.props) 

    return (
     <div> 
     <button onClick={actions.myAction}>My button</button> 
     </div> 

Вот моя кнопка вызова myAction, который когда завершается хочет маршрут в другое место. Я хочу, чтобы получить доступ к этой функции transitionTo в моей action и выполняет что-то вроде router.transitionTo("/page1")

Для этого я должен получить history объект, который содержит transitionTo функцию. Итак, как я могу передать объект this.props.history действиям. Когда я onClick={actions.myAction(this.props.history)} моя кнопка не вынесенное ..

Любая помощь

+0

Будь осторожен со словом «среагировать», вы можете получить иск. – Leif

ответ

0

Я не согласен с вашим подходом, но найти сильфонные решение вашей проблемы:

handleBtnClick() { 
    actions.MyAction(this.props.history); 
} 

render() { 
    return (
    <div> 
     <button onClick={ this.handleBtnClick.bind(this) }>My button</button> 
    </div> 
); 
} 

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

onClick ожидает выражение функции (то, что оценивает выражение функции). Вы не должны делать сложные звонки там, например, actions.myAction(this.props.history).

Я предлагаю вам использовать react-router-redux и обрабатывать переходы по URL-адресам, используя routeActions и настраиваемое промежуточное ПО промежуточного уровня. Я могу расширить этот подход, если вы заинтересованы.

EDIT:

Если вы используете react-router-redux, то вы должны воспользоваться методами в routeActions. Метод, который вам нужен в этом случае, - push(). Итак, если вы хотите перейти на URL-адрес /user/account, вы просто вызываете dispatch(routeActions.push('/user/account')), а реакция-маршрутизатор-редукция будет обрабатывать переход.

Например:

import { routeActions } from 'react-router-redux'; 

// Action creator  
function mySuperAction(flag) { 
    return (dispatch, getState) => { 
    dispatch(routeActions->push('/user/account')); 
    } 
}); 

Вы должны иметь свой магазин правильно настроена с среагировать-маршрутизатор-Redux для того, чтобы это работало.

Или из компонента:

import { routeActions } from 'react-router-redux'; 
import { connect } from 'react-redux'; 
import React from 'react'; 

class MyComponent extends React.Component { 
    handleClick() { 
    this.props.dispatch(routeActions.push('/user/account')); 
    } 

    render() { 
    return (
     <div> 
     <button onClick={ this.handleClick.bind(this) }>My button</button> 
     </div> 
    ); 
    } 
} 
export default connect()(MyComponent); 
+0

определенно я ищу это ..Я реализовал 'response-redux-router' и в моем действии, когда я делаю' getState() 'Я получаю его предоставление мне« router »objeect, но у него нет функции« transitionTo », поэтому я не могу маршрутизировать это. поэтому я хочу реализовать этот подход. В моем магазине я также реализовал 'reduxReactRouter'. Пожалуйста, вы можете это уточнить – gamer

+0

Я думаю, что я что-то пропускаю с 'store' .., когда я печатаю' store' в консоли, чтобы он дал мне 'dispatch, setState, history' и т. Д. Функции – gamer

+0

Я обновил свой ответ. –

1

ответы выше правильно, но падают Appart при переходе на "Stateless Components" этой быстро разваливается. Мое предложение использует функцию более высокого порядка, чтобы позаботиться о том, чтобы предотвратить предотвращение действия по умолчанию по клику и предоставление правильных аргументов. Если вы уже используете ES2015 (через Бабель, например), это может быть это просто:

const preventDefault = (fn, ...args) => (e) => { 
    e.preventDefault(); 
    fn(...args); 
}; 

Тогда в ваших компонентах называют так:

const Item = ({ 
    item, 
    openItem 
}) => (
    <div> 
    <h1>{item.title}</h1> 
    <a href="#" onClick={preventDefault(openItem, item)}>Open Item</a> // on click will call `openItem(item)`. 
    </div> 
) 
+0

Несмотря на то, что этот метод не рекомендуется реагировать на вопросы github и на этот вопрос http://stackoverflow.com/questions/22639534/pass-props-to-parent-component-in-react-js, но при использовании сокращений и апатридов компонентам становится важным, чтобы мы могли отправить дочерний компонент компонента назад к некоторому родительскому элементу, который имеет 4-5 ссылок в цепочке. –

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