Redux - передать аргумент ownProps в селектор - PullRequest
0 голосов
/ 28 мая 2018

Я не могу передать переменную ownProps из mapStateToProps в селектор.Мой селектор:

export const nameSelector = createSelector(
    [
        state => state.element.get('name')
    ],
    (name) => !name.trim()
);

const mapStateToProps = (state, ownProps) => ({
    disabledAfterSave: nameSelector(state)
});

И мне нужно иметь селектор:

export const nameSelector = createSelector(
        [
            state => state.element.get('name')
        ],
        (name, ownProps) => !name.trim() && ownProps.showMessage
    );

const mapStateToProps = (state, ownProps) => ({
    disabledAfterSave: nameSelector(state, ownProps)
});

Но теперь я получаю ошибку: ReferenceError: ownProps is not defined.

Когда я пыталсяпередайте его, как показано ниже:

export const nameSelector = (ownProps) => createSelector(
        [
            state => state.element.get('name')
        ],
        (name) => !name.trim() && ownProps.showMessage
    );

возвращаемый тип не bool, а [Function selector].Как я могу передать этот аргумент моему селектору?

1 Ответ

0 голосов
/ 30 мая 2018

Вот как исправить ваш селектор и его использование :

export const nameSelector = createSelector(
  [
    state => state.element.get('name'),
    (state, ownProps) => ownProps.showMessage
  ],
  (name, showMessage) => !name.trim() && ownProps.showMessage
)

const mapStateToProps = (state, ownProps) => ({
  disabledAfterSave: nameSelector(state, ownProps)
})

Вот общий рабочий пример, чтобы проиллюстрировать, как вы можете передавать опоры внизк селектору :

const createSelector = Reselect.createSelector

// Selector: Get Active Users
const getUsers = createSelector([state => state.users], users => users.filter(u => u.active))

// Selector: Get Active Users by Country
// Here you can check how I pass the country prop
const getUsersByCountry = createSelector([getUsers, (state, props) => props.country],
 (users, country) => users.filter(u => u.country === country))

// The state
const state = {
  users: [
    { id: 1, name: 'Jordan', country: 'Bulgaria', active: true},
    { id: 2, name: 'Nadezhda', country: 'Bulgaria', active: true},
    { id: 3, name: 'Hristo', country: 'Bulgaria', active: false},
    { id: 4, name: 'Bobby', country: 'England', active: true},
    { id: 5, name: 'Kaloyan', country: 'Germany', active: true},
  ]
}

// Testing
console.log(getUsers(state))
console.log(getUsersByCountry(state, { country: 'Bulgaria' }))
<script src="https://cdnjs.cloudflare.com/ajax/libs/reselect/3.0.1/reselect.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...