Skip to content

dva 对象

dva.js 中,核心对象是 app,它提供了对整个应用的控制和配置。通过 app 对象,你可以加载模型(models)、路由、插件,并启动应用程序。此外,app 还提供了一些实用的方法来简化开发流程,如访问全局状态、派发动作等。

创建 dva 应用

首先,你需要创建一个 dva 实例:

javascript
import dva from "dva";

// 1. 创建 dva 应用实例
const app = dva();

// 2. 加载模型
app.model(require("./models/example").default);

// 3. 启动应用
app.start("#root");

核心 API

app.model(model)

用于加载模型到应用中。模型是 dva 中组织状态管理和数据交互逻辑的地方。

示例:加载模型

javascript
app.model(require("./models/example").default);

app.router()

用于定义应用的路由配置。你可以使用 react-router 的 API 来设置路由规则。

示例:定义路由

javascript
import React from "react";
import { Router, Route } from "dva/router";
import Home from "./pages/Home";
import About from "./pages/About";

app.router(({ history }) => (
  <Router history={history}>
    <Route path="/" exact component={Home} />
    <Route path="/about" component={About} />
  </Router>
));

app.start(container)

启动应用并渲染根组件。你需要传递一个 DOM 容器选择器或元素作为参数。

示例:启动应用

javascript
app.start("#root");

app.use(plugin)

用于注册插件,以扩展应用的功能。插件可以修改默认行为、添加新功能等。

示例:使用插件

javascript
import createLoading from "dva-loading";

app.use(createLoading());

app._store

获取 Redux store。虽然直接操作 store 不是推荐的做法,但在某些情况下可能需要访问 store。

示例:访问 store

javascript
const store = app._store;

app.dispatch(action)

用于手动派发 action。通常你不需要直接调用这个方法,因为你可以通过 connect 或 Hooks 在组件内部派发 actions。

示例:手动派发 action

javascript
app.dispatch({ type: "example/increment" });

模型 (Model)

模型是 dva 的核心概念之一,用来组织状态管理的数据流。每个模型包含以下属性:

  • namespace:命名空间,确保不同模型之间的状态不会冲突。
  • state:当前的状态。
  • reducers:纯函数,接收 action 并返回新的 state。
  • effects:处理副作用(如异步操作)的函数,通常使用 redux-saga
  • subscriptions:监听某些事件并触发 effects 或 reducers。

示例:创建模型

javascript
export default {
  namespace: "example",

  state: {
    count: 0,
  },

  reducers: {
    increment(state) {
      return { ...state, count: state.count + 1 };
    },
    decrement(state) {
      return { ...state, count: state.count - 1 };
    },
  },

  effects: {
    *incrementAsync(action, { call, put }) {
      yield call(delay, 1000); // 模拟异步请求
      yield put({ type: "increment" });
    },
  },

  subscriptions: {
    setup({ history }) {
      // 监听 URL 变化或其他事件
    },
  },
};

function delay(timeout) {
  return new Promise((resolve) => setTimeout(resolve, timeout));
}

使用 Hooks 访问 app

从 dva v2 开始,支持使用 React Hooks 来访问 app 和 dispatch actions,这使得函数组件可以直接与 dva 的数据流集成。

示例:在函数组件中使用 Hooks

javascript
import React, { useEffect } from "react";
import { useDispatch, useSelector } from "dva";
import styles from "./Home.module.css";

function Home() {
  const dispatch = useDispatch();
  const count = useSelector((state) => state.example.count);

  useEffect(() => {
    dispatch({ type: "example/incrementAsync" });
  }, [dispatch]);

  return (
    <div className={styles.home}>
      <p>Count: {count}</p>
      <button onClick={() => dispatch({ type: "example/increment" })}>
        Increment
      </button>
      <button onClick={() => dispatch({ type: "example/decrement" })}>
        Decrement
      </button>
    </div>
  );
}

export default Home;

总结

dva.jsapp 对象是整个应用的核心,提供了加载模型、定义路由、启动应用等功能。通过理解 app 对象及其提供的 API,你可以更好地掌握如何构建和管理基于 dva 的 React 应用程序。

Released under the MIT License.