2016-08-15 4 views
4

Мне было любопытно, есть ли способ передать параметр промежуточному программному обеспечению, не извлекая его из состояния. Я хочу сделать, чтобы передать общую функцию, которую мы используем, которая определяет, аутентифицирован ли пользователь или нет. Поэтому вместо того, чтобы возвращать информацию аутентификации из состояния, которое будет дублировать код, я хочу передать функцию isAuthenticated промежуточному программному обеспечению.Передача параметров конструкции промежуточному программному обеспечению redux

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

ответ

2

Ок правильный способ сделать это оказывается функция обертки, которая будет завернуть фактическую функцию MiddleWare

export const middlewareFunction = (store) => (next) => (action) => { 
    do some stuff with something... 
} 

Если это фактическая функция промежуточного слоя, чем вы должны применять к промежуточному, как

applyMiddleware(middlewareFunction); 

То, что вы должны делать, чтобы передать параметр, чтобы реализовать функцию как

export const middlewareWrapper = (args) => { 
    do some stuff with your args 
    return (state) => (next) => (action) => { 
     do more stuff with your args and actions 
    } 
} 

С помощью этого синтаксиса можно применить к промежуточному как:

applyMiddleware(middlewareFunction(args)); 
1

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

В апи промежуточного слоя из real world example of redux вы можете увидеть, что endpoint может быть функцией, а фактическая конечная точка может быть вычислена из состояния (см код между комментариями звездочками):

export default store => next => action => { 
    const callAPI = action[CALL_API] 
    if (typeof callAPI === 'undefined') { 
    return next(action) 
    } 

    let { endpoint } = callAPI 
    const { schema, types } = callAPI 

/***************************************************************************/  
    /** if the endpoint is a function compute the actual endpoint from state ***/ 
    if (typeof endpoint === 'function') { 
    endpoint = endpoint(store.getState()) 
    } 
    /***************************************************************************/ 

    if (typeof endpoint !== 'string') { 
    throw new Error('Specify a string endpoint URL.') 
    } 
    if (!schema) { 
    throw new Error('Specify one of the exported Schemas.') 
    } 
    if (!Array.isArray(types) || types.length !== 3) { 
    throw new Error('Expected an array of three action types.') 
    } 
    if (!types.every(type => typeof type === 'string')) { 
    throw new Error('Expected action types to be strings.') 
    } 

    function actionWith(data) { 
    const finalAction = Object.assign({}, action, data) 
    delete finalAction[CALL_API] 
    return finalAction 
    } 

    const [ requestType, successType, failureType ] = types 
    next(actionWith({ type: requestType })) 

    return callApi(endpoint, schema).then(
    response => next(actionWith({ 
     response, 
     type: successType 
    })), 
    error => next(actionWith({ 
     type: failureType, 
     error: error.message || 'Something bad happened' 
    })) 
) 
} 
0

Я считаю, правильный подход снова карри.

файла, где используется промежуточное программное обеспечение

import myMiddleWare from '/myMiddleWare.js' 
import { applyMiddleware } from 'redux' 

args = // whatever arguments you want  
applyMiddleware(myMiddleWare(args)) 

myMiddleWare.js

export default (args) => ({getState, dispatch}) => (next) => (action) => (
    // Use args do your hearts content 
) 
Смежные вопросы