Skip to content

React使用Dva构建应用 #19

@Wscats

Description

@Wscats

安装

全局安装dva-cli脚手架,会应有一个新的dva命令,使用它来初始化一个新的dva项目,然后它会自动安装所需的依赖,然后进入该项目文件夹,然后执行npm start启动项目

npm install dva-cli -g dva -v dva new dva-quickstart cd dva-quickstart npm start

路由

routes目录下新建Products.jsx组件

import React from 'react'; // 是帮你连接组件和redux import { connect } from 'dva'; // 这是dispatch和products是来自于props的方法,是connect后提供的 // {dispatch, products}等价于props.dispatch和props.products const Products = ({ dispatch, products }) => { function handleDelete(id, e) { // 获取按钮传递的数据 console.log(id, e) // 获取Model的state的数据 console.log(products) dispatch({ // 触发Model中的action方法 type: 'products/delete', // 这里是传过去Model的数据 payload: { name: "lemon", age: 18, skill: ['ps', 'css', 'js'] }, }); } return (<div> <h2>Dva连接Redux的示例</h2> <button onClick={handleDelete.bind(this, 1)}>连接Model</button> </div>) }; export default connect(({ products }) => ({ products, }))(Products);

在上面的路由组件中我们看到connect,由于dva提供了connect 方法,这个 connect就是react-reduxconnect方法,帮助我们建立组件和Model之间关系

然后添加路由信息到路由表,编辑router.js

import Products from './routes/Products'; <Route path="/products" exact component={Products} />

Model

可以使用Model来封装一个类似于react-redux的数据仓库,来交互组件之间的数据

models目录下新建products.js文件

export default { namespace: 'products', // state: { // author: "wscats" // }, state:{},//如果这里为空可以在index.js的dva()方法中初始化值 reducers: { 'delete'(state, { payload }) { // state是Model里面存放的state数据 // payload是获取来自于Product.jsx组件的dispatch传过来的payload参数 console.log("触发了redux", state, payload) // 这里是返回新的state数据 return { ...state, ...payload } }, // 可以存放多个action的方法 add(state, { payload }) { } }, };
  • namespace 表示在全局 state 上的 key
  • state 是初始值,在这里是空数组
  • reducers 等同于 redux 里的 reducer,接收 action,同步更新 state

然后在index.js文件里面载入它

// 3. Model app.model(require('./models/products').default);

如果已经在state里面初始化了数据,那就可以忽略下面这一步,但如果state没有定义值,可以在index.js中的dva()方法中初始化值

// 1. Initialize const app = dva({ initialState: { products: { author: "Eno Yao" } } });

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions