{"id":19069625,"url":"https://github.com/srect/dvajs_todolist","last_synced_at":"2025-08-12T05:16:38.664Z","repository":{"id":114172596,"uuid":"358244516","full_name":"sRect/dvajs_todolist","owner":"sRect","description":"dvajs todolist","archived":false,"fork":false,"pushed_at":"2021-04-16T09:57:27.000Z","size":233,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-15T03:12:09.619Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sRect.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-15T12:06:23.000Z","updated_at":"2021-04-16T09:57:30.000Z","dependencies_parsed_at":null,"dependency_job_id":"f83db47c-f7c2-4e78-8d32-6428baff23e5","html_url":"https://github.com/sRect/dvajs_todolist","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sRect/dvajs_todolist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2Fdvajs_todolist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2Fdvajs_todolist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2Fdvajs_todolist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2Fdvajs_todolist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sRect","download_url":"https://codeload.github.com/sRect/dvajs_todolist/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2Fdvajs_todolist/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270005591,"owners_count":24510939,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T01:14:59.009Z","updated_at":"2025-08-12T05:16:38.629Z","avatar_url":"https://github.com/sRect.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## dvajs\n\n### 1. 项目结构\n```\n├── node_modules\n├── package.json\n├── public\n|  ├── favicon.ico\n|  ├── index.html\n|  ├── logo192.png\n|  ├── logo512.png\n|  ├── manifest.json\n|  └── robots.txt\n├── README.md\n├── src\n|  ├── components\n|  |  ├── Addtodo.js\n|  |  └── TodoListItem.js\n|  ├── index.js\n|  ├── models\n|  |  ├── count.js\n|  |  └── todos.js\n|  ├── router.js\n|  └── routes\n|     ├── Count.js\n|     └── Todos.js\n└── yarn.lock\n```\n\n### 2. 入口`index.js`\n```javascript\nimport dva from \"dva\";\nimport router from \"./router\";\n\nconst allModel = require.context('./models', true, /\\.js$/);\n\n// 1.init\nconst app = dva();\n\n// 2.定义Model\n// app.model(require(\"./models/todos\").default);\nallModel.keys().forEach((key) =\u003e {\n  // console.log(\"allModel(key).default\", allModel(key).default);\n  app.model(allModel(key).default);\n});\n\n// 3.Router\napp.router(router);\n// 4.Start\napp.start(\"#root\");\n```\n\n### 3. 路由`router.js`\n```javascript\nimport { Route, Router, Switch, Link } from \"dva/router\";\nimport Todos from \"./routes/Todos\";\nimport Count from './routes/Count';\n\nfunction RouterConfig({ history }) {\n  return (\n    \u003cRouter history={history}\u003e\n      \u003c\u003e\n        \u003cLink to=\"/\"\u003ehome\u003c/Link\u003e | \u003cLink to=\"/count\"\u003ecount\u003c/Link\u003e\n        \u003cSwitch\u003e\n          \u003cRoute path=\"/\" exact component={Todos} /\u003e\n          \u003cRoute path=\"/count\" exact component={Count} /\u003e\n        \u003c/Switch\u003e\n      \u003c/\u003e\n    \u003c/Router\u003e\n  );\n}\n\nexport default RouterConfig;\n```\n\n### 4. `models \u003e count`模型\n```javascript\nconst delay = (time) =\u003e {\n  return new Promise((resolve) =\u003e {\n    setTimeout(() =\u003e resolve(), time);\n  });\n};\n\nconst countStore = {\n  namespace: \"count\",\n  state: {\n    count: 1,\n  },\n  reducers: {\n    add(state, { payload }) {\n      return { count: state.count + (payload?.num || 1) };\n    },\n    minus(state) {\n      return { count: state.count - 1 };\n    },\n  },\n  effects: {\n    // 异步添加\n    *asyncAdd({ payload }, effect) {\n      const { call, put } = effect;\n\n      yield call(delay, 1000);\n      yield put({ type: \"add\", payload });\n    },\n  },\n  // 订阅\n  subscriptions: {\n    setup(props) {\n      const { history, dispatch } = props;\n      return history.listen(({ pathname }) =\u003e {\n        if (pathname === \"/count\") {\n          alert(\"subscriptions\");\n          dispatch({\n            type: \"asyncAdd\",\n            payload: {\n              num: 1,\n            },\n          });\n        }\n      });\n    },\n  },\n};\n\nexport default countStore;\n```\n\n### 5. `routes \u003e Count`页面\n```javascript\nimport React from \"react\";\nimport { connect } from \"dva\";\n\nconst Count = (props) =\u003e {\n  const { count, add, minus, asyncAdd } = props;\n\n  return (\n    \u003cdiv\u003e\n      count: {count} \u003cbr /\u003e\n      \u003cbutton onClick={add}\u003eadd\u003c/button\u003e\n      \u003cbutton onClick={minus}\u003eminus\u003c/button\u003e\n      \u003cbutton onClick={() =\u003e asyncAdd(10)}\u003easyncAdd +10\u003c/button\u003e\n    \u003c/div\u003e\n  );\n};\n\nconst mapStateToProps = (state) =\u003e state.count;\n\nconst mapDispatchToProps = (dispatch) =\u003e ({\n  add() {\n    dispatch({\n      type: \"count/add\",\n    });\n  },\n  minus() {\n    dispatch({\n      type: \"count/minus\",\n    });\n  },\n  asyncAdd(num) {\n    dispatch({\n      type: \"count/asyncAdd\",\n      payload: {\n        num,\n      },\n    });\n  },\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Count);\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrect%2Fdvajs_todolist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrect%2Fdvajs_todolist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrect%2Fdvajs_todolist/lists"}