首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在类组件中设置zustand状态

如何在类组件中设置zustand状态
EN

Stack Overflow用户
提问于 2021-02-07 12:49:57
回答 5查看 1.8K关注 0票数 8

我在一个网站上工作,该网站使用zustand在文件中存储了一段全局状态。我需要能够在类组件中设置该状态。我可以使用钩子在函数组件中设置状态,但我想知道是否有一种方法可以在类组件中使用zustand。

如果有用的话,我已经为这个问题创建了一个沙箱:https://codesandbox.io/s/crazy-darkness-0ttzd

这里我在一个功能组件中设置状态:

代码语言:javascript
复制
function MyFunction() {
  const { setPink } = useStore();

  return (
    <div>
      <button onClick={setPink}>Set State Function</button>
    </div>
  );
}

我的状态存储在这里:

代码语言:javascript
复制
export const useStore = create((set) => ({
  isPink: false,
  setPink: () => set((state) => ({ isPink: !state.isPink }))
}));

如何在类组件中设置状态?:

代码语言:javascript
复制
class MyClass extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }

  render() {
    return (
      <div>
        <button
          onClick={
            {
              /* setPink */
            }
          }
        >
          Set State Class
        </button>
      </div>
    );
  }
}
EN

回答 5

Stack Overflow用户

发布于 2021-02-07 15:30:42

类组件与钩子最相似的是高阶组件(HOC)模式。让我们将钩子useStore转换为即席withStore

代码语言:javascript
复制
const withStore = BaseComponent => props => {
  const store = useStore();
  return <BaseComponent {...props} store={store} />;
};

我们可以在包装在withStore中的任何类组件中作为道具访问存储。

代码语言:javascript
复制
class BaseMyClass extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }

  render() {
    const { setPink } = this.props.store;
    return (
      <div>
        <button onClick={setPink}>
          Set State Class
        </button>
      </div>
    );
  }
}

const MyClass = withStore(BaseMyClass);
票数 4
EN

Stack Overflow用户

发布于 2021-02-07 14:30:43

它似乎使用了钩子,所以在类中你可以使用实例:

代码语言:javascript
复制
import { useStore } from "./store";

class MyClass extends Component {
  render() {
    return (
      <div>
        <button
          onClick={() => {
            useStore.setState({ isPink: true });
          }}
        >
          Set State Class
        </button>
      </div>
    );
  }
}

票数 1
EN

Stack Overflow用户

发布于 2021-02-07 14:30:43

创建一个功能组件和基于类的组件都可以使用的React上下文提供程序。将useStore挂钩/状态移动到上下文提供程序。

store.js

代码语言:javascript
复制
import { createContext } from "react";
import create from "zustand";

export const ZustandContext = createContext({
  isPink: false,
  setPink: () => {}
});

export const useStore = create((set) => ({
  isPink: false,
  setPink: () => set((state) => ({ isPink: !state.isPink }))
}));

export const ZustandProvider = ({ children }) => {
  const { isPink, setPink } = useStore();

  return (
    <ZustandContext.Provider
      value={{
        isPink,
        setPink
      }}
    >
      {children}
    </ZustandContext.Provider>
  );
};

index.js

ZustandProvider组件包装应用程序。

代码语言:javascript
复制
...
import { ZustandProvider } from "./store";
import App from "./App";

const rootElement = document.getElementById("root");
ReactDOM.render(
  <StrictMode>
    <ZustandProvider>
      <App />
    </ZustandProvider>
  </StrictMode>,
  rootElement
);

在两个组件中使用ZustandContext上下文

MyFunction.js

代码语言:javascript
复制
import React, { useContext } from "react";
import { ZustandContext } from './store';

function MyFunction() {
  const { setPink } = useContext(ZustandContext);

  return (
    <div>
      <button onClick={setPink}>Set State Function</button>
    </div>
  );
}

MyClass.js

代码语言:javascript
复制
import React, { Component } from "react";
import { ZustandContext } from './store';

class MyClass extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }

  render() {
    return (
      <div>
        <button
          onClick={this.context.setPink}
        >
          Set State Class
        </button>
      </div>
    );
  }
}

MyClass.contextType = ZustandContext;

App中换入新的ZustandContext,而不是直接使用useStore挂钩。

代码语言:javascript
复制
import { useContext} from 'react';
import "./styles.css";
import MyClass from "./MyClass";
import MyFunction from "./MyFunction";
import { ZustandContext } from './store';

export default function App() {
  const { isPink } = useContext(ZustandContext);

  return (
    <div
      className="App"
      style={{
        backgroundColor: isPink ? "pink" : "teal"
      }}
    >
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <MyClass />
      <MyFunction />
    </div>
  );
}

如果您不能在MyClass组件上设置任何特定的上下文,您可以使用ZustandContext.Consumer来提供setPink回调作为工具。

代码语言:javascript
复制
<ZustandContext.Consumer>
  {({ setPink }) => <MyClass setPink={setPink} />}
</ZustandContext.Consumer>

MyClass

代码语言:javascript
复制
<button onClick={this.props.setPink}>Set State Class</button>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66084662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档