next-react-valtio: 基于 valtio 状态管理工具

基于 valtio 的工具
更新于: 2024-01-22 21:12:25
项目主页: https://github.com/afeiship/next-react-valtio

安装

yarn add derive-valtio valtio
yarn add @jswork/next-react-valtio

使用

const Login = () => {
  const initialState = {
    count: 0,
    user: { first: '', last: '', age: '' }
  };
  const { state, store, ...derived } = nx.$valtio(initialState, {
    tripled: (store) => store.count * 3,
    fullname: (store) => `${store.user.first} ${store.user.last}`
  });
  // ...
}

实战

相对完整的实际使用场景。

const Login = () => {
  const initialState = {
    count: 0,
    user: { first: '', last: '', age: '' }
  };
  
  const { state, store, ...derived } = nx.$valtio(initialState, {
    tripled: (store) => store.count * 3,
    fullname: (store) => `${store.user.first} ${store.user.last}`
  });


  console.log('login derived', derived);

  return (
    <div className="rounded-md bg-slate-100 p-4 transition-all hover:bg-slate-200">
      <h1>login</h1>
      <h2>{state.count}</h2>
      <nav className="mb-2 flex gap-2">
        <button onClick={() => (store.count += 1)}>add</button>
        <button onClick={() => (store.count -= 1)}>sub</button>
      </nav>
      <form
        className="flex flex-col gap-2"
        onSubmit={(e) => {
          e.preventDefault();
          handleLogin();
        }}>
        <input
          type="text"
          placeholder="first name"
          value={state.user.first}
          onChange={(e) => (store.user.first = e.target.value)}
        />
        <input
          type="text"
          placeholder="last name"
          value={state.user.last}
          onChange={(e) => (store.user.last = e.target.value)}
        />
        <input
          type="password"
          placeholder="password"
          value={state.user.age}
          onChange={(e) => (store.user.age = e.target.value)}
        />
        <footer className="mt-2 flex gap-2">
          <button type="submit">Login</button>
          <button
            onClick={() => {
              nx.mix(store.user, {
                name: 'aric1',
                age: 108
              });
            }}>
            RestValues
          </button>
        </footer>
      </form>
    </div>
  );
};

export default Login;