在util文件中使用react-cookie

时间:2017-08-16 07:52:54

标签: reactjs cookies react-universal

我在react / redux应用中使用react-cookie v2。要设置Cookie,您需要将组件包装在HOC withCookies(component)中,然后您可以使用this.props.cookies.set('first_cookie', someCookie);来设置Cookie。

但是,我想在我的所有组件都可以用来设置cookie的util文件中设置我的cookie。例如。

storageUtil.js
export const setToCookies = (key, value, options) => {
    cookies.set(key, value, options);
};

此util文件无法用withCookies包装,因此不会直接使用Cookie。 我可以从using组件(setToCookies(cookiesInstance, key, value, options))传入cookie实例,但如果可能的话,我宁愿在util文件中导入cookie实例。

这必须是一个非常常见的用例(用于处理util文件中的cookie),我无法找到执行此操作的最佳方法。

1 个答案:

答案 0 :(得分:0)

我会在搜索通用解决方案时编写我发现的两种方法。如果提供了更好的解决方案,我将更改已接受的答案。

解决方案1:

withCustomCookies.js

import React from 'react';
import { withCookies } from 'react-cookie';

export function withCustomCookies(Component) {

    return (props) => {
        // CookieComponent needs a capital letter bc of JSX
        let ExtendedCookieComponent = withCookies(withEncapsulatedCookies(Component));

        return (
            <ExtendedCookieComponent
                {...props} />
        );
    };
}

export function withEncapsulatedCookies(Component) {

    return (props) => {
        // Only expose our own cookies methods defined in this scope
        const {
            // Dont expose cookies in using component
            cookies, // eslint-disable-line no-unused-vars
            ...cleanedProps
        } = props;

        function getFromCookies(key) {
            // Stuff to always do when getting a cookie
            return cookies.get(key);
        }

        function setToCookies(key, value, options) {
            // Stuff to always do when setting a cookie
            cookies.set(key, value, options);
        }

        return (
            <Component
                getFromCookies={getFromCookies}
                setToCookies={setToCookies}
                {...cleanedProps} /> // All Props except for cookies
        );
    };
}

用作:

  1. 导入并换行export default withCustomCookies(Component);
  2. 在组件this.props.getFromCookies(COOKIE_NAME);
  3. 中使用如下所示

    解决方案2:

    使用常规的cookieUtils文件并传入cookie:

    cookieUtils.js
    export const setToCookies = (cookies, key, value, options) => {
       // Stuff to always do when setting a cookie
       cookies.setCookie(key, value, options);
    };
    

    用作:

    1. 在组件中导入setToCookies并在组件上使用withCookies(withCookies(NameOfComponent))。
    2. 将组件中的方法用作setToCookies(this.props.cookies, key, value, options);