2016-03-16 5 views
0

Rudx-thunk отлично поработал для отправки асинхронных действий, в конечном итоге он изменит состояние, выбранное в асинхронном действии. Но как мне узнать момент, когда он, наконец, изменит состояние редукции?В регрессивно-интерактивном веб-приложении, как узнать одно действие асинхронного действия, наконец отправлено в состояние

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

Обновление # 1 показывает некоторый код, чтобы выразить себя лучше.

// reducer 
(state, action) => Object.assign({}, state, {config: action.config}); 

// action creator 
const fetchConfig =() => (dispatch) => { 
    fetch('http://server.com/...') 
    .then(config=>dispatch({type: 'LOAD_CONFIG', config})) 
} 

// connect reducer to state 
createStore({config: configReducer}) 

// render 
import { render } from 'react-dom'; 
render (<App><News /></App>) 

// some component consume state.config 
@connect(state=>{config: state.config}) 
const News = props=>(
    <div> 
     {(props.config === '...')? <div>...</div> : <div>...</div>} 
    </div> 
) 

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

// render 
loadConfigFinished 
.then(()=> render((<App><News /></App>))) 

Или

// render 
on('loadConfigFinished',()=> render((<App><News /></App>))); 

Вероятно, я должен сделать 2-й путь, просто боюсь его не является редукцией-у.

Как бы то ни было, приведенный выше пример - это пример, который иногда нам нужно уведомлять, когда какое-либо действие, наконец, отправляется в состояние redux.

ответ

2

Посмотрев на свой код, я собираю ваш вопрос просто: когда я визуализирую компонент, который зависит от данных с сервера, ожидая этих данных, не передавая undefined в мой компонент?

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

const Container = props => { 
    if (props.config) { 
    return <ConfiguredComponent config={props.config} /> 
    } else { 
    return <Loading /> 
    } 
} 
+0

Smart. Но я просто волнуюсь, что я должен поместить логику в каждый компонент, используя конфигурацию. – Ron

+0

Да, это общий танец с использованием React/Redux: как я могу пройти как можно меньше, насколько это возможно, так как все проходит мимо? ... Если config настолько вездесущ, вы можете захотеть включить эти значения на сервере или выполнить рендеринг на стороне сервера. – pfkurtz

+0

Я добрый думаю, что redux-thunk - это решение для асинхронных действий, поскольку это в основном модель согласованности. Я не знаю, когда это произойдет, но иногда этот момент имеет важное значение. когда приходит к порядку инициализации. – Ron

0
export function readConfig() { 
    return (dispatch) => { 
    dispatch(readingConfig()); 

    someAsyncFunction((error, result) => { 
     if (!error) { 
     dispatch(readConfigSuccess(result)); 
     } else { 
     dispatch(readConfigFail(error)); 
     } 
    }); 
    } 
} 

И, конечно же, readConfigSuccess, readConfigFail и readingConfig являются действия функции создателя, возвращающие объекты действий и т.д .:

export const READING_CONFIG = 'READING_CONFIG'; 
export function readingConfig() { 
    return { 
    type: READING_CONFIG, 
    } 
} 
+0

Я не решить мою проблему. Я хочу использовать эту конфигурацию в своих компонентах, поэтому мне нужно сделать что-то вроде: readConfig(). Then (ReactDOM.reander (

...
). – Ron

+0

Мне нужно будет увидеть некоторые из вашего кода.Не могли бы вы отредактировать свой пост, чтобы включить его? Использование 'ReactDOM.render' таким образом кажется неправильным. – ffxsam

0

Когда ваши переходы обрабатывать действия readConfigSuccess, они уточняют Redux состояние.

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

За исключением того, что обычно изменяется только небольшая часть состояния, а ревердер очень похож на предыдущий рендер, и здесь я ожидаю, что относительно большая часть состояния будет изменена редукторами для этого конкретного действия и rerender сделает много измененное приложение.

Это не для вас, чтобы беспокоиться, хотя, это должно просто работать.

Или вы имеете в виду что-то еще, хотите ли вы сделать больше асинхронной работы в результате получения конфигурации?

+0

Я не выражал себя четко, поэтому я обновил свой вопрос, чтобы выразить себя лучше, не могли бы вы взглянуть? – Ron

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

  • Нет связанных вопросов^_^