What are selectors in redux?

前端 未结 4 412
迷失自我
迷失自我 2020-12-23 16:22

I am trying to follow this code in redux-saga

export const getUser = (state, login) => state.entities.users[login]
export const getRepo = (st         


        
4条回答
  •  礼貌的吻别
    2020-12-23 16:56

    function mapStateToProps (state) {
        return {
            user: state.user,
        }
    }
    
    initialState of reducer by user store
    const initialState = {
      isAdmin:false,
      isAuth:false,
      access:[1,2,5]
    };
    
    class AppComp extends React.Component{
    render(){
            const {user: { access:access}} = this.props;
            const rand = Math.floor(Math.random()*4000)
            return (
    {`APP ${rand} `}

    TOTAL STATUS COUNT IS {access.length}

    ) } }}

    but you can use selector

    var getUser = function(state) {
        return state.user
    }
    
    
    const getAuthProp = createSelector(
        getUser,
        (user) => user.access
    );
    
    
    function mapStateToProps (state) {
        return {
           // user: state.user,
            access: getAuthProp(state)
        }
    }
    

    Main Problem is this component use all user: state.user and any changes in user (etc isAdmin ,isAuth, access) runs rerender this component which need only part of this store - access!!!

    In Redux, whenever an action is called anywhere in the application, all mounted & connected components call their mapStateToProps function. This is why Reselect is awesome. It will just return the memoized result if nothing has changed.

    In the real world, you will most likely need the same certain part of your state object in multiple components.

    https://medium.com/@parkerdan/react-reselect-and-redux-b34017f8194c

    The createSelector function provided by Reselect implements the most basic way to derive a selector from previous selectors. The simplest use case is to derive a selector from a single other selector. In this case, the parameters to createSelector are the input selector and a function transforming the result of that selector into the result of the new selector. For example

    var getProducts = function(state) {
        return state.products
    }
    
    
    import {getProducts} from '../app/selectors'
    import {createSelector} from 'reselect'
    
    export const getProductTitles = createSelector(
        getProducts,
        (products) => products.map((product) => product.get('title'))
    )
    

    This is equivalent to (ignoring memoization):

    import {getProducts} from '../app/selectors'
    
    export const getProductTitles = (state) => {
        return getProducts(state).map((product) => product.get('title'))
    }
    

    The createSelector function can combine data from multiple selectors as well as from a single selector. We can pass any number of selectors to createSelector, and their results will be passed to the function passed as the final argument. For a (somewhat contrived) example:

    const isInCheckout = createSelector(
        getIsShippingPage,
        getIsBillingPage,
        getIsConfirmationPage,
        (isShipping, isBilling, isConfirmation) =>
            isShipping || isBilling || isConfirmation
    )
    

    is equivalent to

    const isInCheckout = (state) => {
        return (
            getIsShippingPage(state) ||
            getIsBilingPage(state) ||
            getIsConfirmationPage(state)
        )
    }
    

    common pattern when writing mapStateToProps functions with selectors is to return an object with each key storing the result of a particular selector. The createStructuredSelector helper function in Reselect lets us write this pattern with the minimum of boilerplate. For example, if we writ

    const mapStateToProps = createStructuredSelector({
        title: getProductTitle,
        price: getProductPrice,
        image: getProductImage
    })
    

    it is equivalent to

    const mapStateToProps = (state) => {
        return {
            title: getProductTitle(state),
            price: getProductPrice(state),
            image: getProductImage(state)
        }
    }
    

    https://docs.mobify.com/progressive-web/0.15.0/guides/reselect/

提交回复
热议问题