gfs-react-dm
Version:
简化react和redux的繁杂流程,更简单的数据操作管理
524 lines • 29.6 kB
JSON
{
"project": {
"name": "gfs-react-dm",
"description": "<p style=\"color:red\">文档持续完善中...</p>\n<p>\n将react、redux整合一起使用的繁琐步骤进行封装,对外提供<code>@View</code>、<code>@Control</code>、<code>@Model</code>分别对应react component、redux action、redux store调用\n</p>\n<ul>\n <li style=\"margin-bottom:8px\"><strong>@View</strong> 利用react-redux中提供的connect包装器将store、control(action)与Component建立联系,使Component具有操作store和调用control的能力,Component中可直接使用<code>this.props[update/del/insert/save]</code>对store数据进行更新</li>\n <li style=\"margin-bottom:8px\"><strong>@Control</strong> 拥有与服务端数据通信功能,获取数据后可决定是否更新store或直接什么都不做,提供<code>@Sync</code>装饰器;被装饰的类会返回一个对象列表,提供给Component调用,此外还提供默认的数据修改方法:update、save、del、insert</li>\n <li><strong>@Model</strong> 字段映射关系和数据操作,包括对数据的增删改查;默认提供<code>del</code>、<code>update</code>、<code>save</code>等store方法</li>\n</ul>\n<p><a href=\"https://github.com/future-team/generator-future-static\" target=\"_blank\">generator-future-static</a>提供对应脚手架项目<code>webpack-react</code></p>\n<p>\n 最后<code>page</code>方法将决定具体哪个Component在页面的哪个节点中渲染。\n</p>\n<h3>安装</h3>\n<pre class=\"code prettyprint\">\nnpm install gfs-react-dm --save\n</pre>\n<h3>表单元素数据更新方式</h3>\n<pre class=\"code prettyprint\">\n 后续完善...\n</pre>\n<h3>使用(一个改变年龄的简单例子,适用于2.0以上版本)</h3>\n* View\n<pre class=\"code prettyprint\">\nimport React, { Component /*,PropTypes*/} from 'react'\nimport {Model,Control,Sync,View,page} from 'gfs-react-dm'\n\n@View(TestControl)\nclass TestComponent extends Component {\n constructor(props) {\n super(props)\n }\n\n componentDidMount(){\n setTimeout(()=>{\n //调用control中的方法改变age\n this.props.changeAge(this)\n },1000)\n }\n\n static defaultProps={}\n\n render() {\n console.log('age:',this.props.testmodel.get('age') )\n return (\n <div>\n {this.props.testmodel.get('age')}\n </div>\n )\n }\n}\n\n//渲染到页面\npage(TestComponent)\n</pre>\n\n* Control\n<pre class=\"code prettyprint\">\nimport {Control,fetch,action} from 'gfs-react-dm'\nimport TestModel from '../model/TestModel'\n\n@Control(TestModel)\nclass TestControl {\n constructor(){\n\n }\n\n @action\n changeAge(){\n \n //方法之间可以相互调用\n book = this.getBook()\n\n fetch('/test.json',/*params*/).then((data)=>{\n //control中默认提供update、del、insert、save四种操作数据方法\n\n this.update('age','ajax改变的age:'+data.age)\n })\n }\n //pojo\n getBook(){\n return {}\n }\n}\n</pre>\n\n* Model\n<pre class=\"code prettyprint\">\nimport {Model} from 'gfs-react-dm'\n\n@Model\nclass TestModel {\n //必须赋予__name值,否则无法正确查找到store\n static __name = 'test'\n static age = 20\n}\n</pre>",
"version": "2.0.1-beta",
"hideFoundAt": "true",
"hideClassItemTable": "true",
"hideTabItemList": "true",
"hideViewDemo": "true",
"hideEditCode": "true",
"activeTab": "method",
"url": "",
"navs": [
{
"name": "主页",
"url": "index.html"
}
]
},
"files": {
"src/control.js": {
"name": "src/control.js",
"modules": {},
"classes": {
"Control": 1
},
"fors": {},
"namespaces": {}
},
"src/index.js": {
"name": "src/index.js",
"modules": {
"gfs-react-mvc": 1
},
"classes": {
"Page": 1
},
"fors": {},
"namespaces": {}
},
"src/model.js": {
"name": "src/model.js",
"modules": {},
"classes": {
"Model": 1
},
"fors": {},
"namespaces": {}
},
"src/view.js": {
"name": "src/view.js",
"modules": {},
"classes": {
"View": 1
},
"fors": {},
"namespaces": {}
}
},
"modules": {
"gfs-react-mvc": {
"name": "gfs-react-mvc",
"submodules": {},
"classes": {
"Control": 1,
"Page": 1,
"Model": 1,
"View": 1
},
"fors": {},
"namespaces": {},
"tag": "module",
"file": "src/view.js",
"line": 4,
"description": "提供Model、View、Control、Sync、RTools等系列便捷类库"
}
},
"classes": {
"Control": {
"name": "Control",
"shortname": "Control",
"classitems": [],
"plugins": [],
"extensions": [],
"plugin_for": [],
"extension_for": [],
"module": "gfs-react-mvc",
"file": "src/control.js",
"line": 6,
"description": "控制器"
},
"Page": {
"name": "Page",
"shortname": "Page",
"classitems": [],
"plugins": [],
"extensions": [],
"plugin_for": [],
"extension_for": [],
"module": "gfs-react-mvc",
"namespace": "",
"file": "src/index.js",
"line": 17,
"description": "页面渲染"
},
"Model": {
"name": "Model",
"shortname": "Model",
"classitems": [],
"plugins": [],
"extensions": [],
"plugin_for": [],
"extension_for": [],
"module": "gfs-react-mvc",
"namespace": "",
"file": "src/model.js",
"line": 3,
"description": "实体、数据模型,model中的方法和属性都该设置成静态类型"
},
"View": {
"name": "View",
"shortname": "View",
"classitems": [],
"plugins": [],
"extensions": [],
"plugin_for": [],
"extension_for": [],
"module": "gfs-react-mvc",
"namespace": "",
"file": "src/view.js",
"line": 4,
"description": "视图"
}
},
"classitems": [
{
"file": "src/control.js",
"line": 16,
"description": "删除store中某条数据",
"itemtype": "method",
"name": "del",
"params": [
{
"name": "path",
"description": "需要被删除的属性地址,根据具体的对象结构,例如一个结构为:var data={name:'test',other:{age:18}}的对象,如果想删除age的值应该是这样:this.del('data.other.age')",
"type": "String"
},
{
"name": "modelName",
"description": "model名字,默认是绑定model之后的modelname",
"type": "String"
}
],
"return": {
"description": "Function"
},
"example": [
"\n $Control(TestModel)\n class TestControl {\n delTest(data,dispatch,modelJson,model){\n this.del('age')\n }\n }"
],
"class": "Control"
},
{
"file": "src/control.js",
"line": 41,
"description": "更新store中某条数据,主要已合并为主,如果是想将新值覆盖旧值,请使用save方法",
"itemtype": "method",
"name": "update",
"params": [
{
"name": "path",
"description": "需要被删除的属性地址,根据具体的对象结构,例如一个结构为:var data={name:'test',other:{age:18}}的对象,如果想修改age的值应该是这样:this.update('data.other.age',20)",
"type": "String"
},
{
"name": "data",
"description": "需要合并的值",
"type": "String | objaect"
},
{
"name": "modelName",
"description": "model名字,默认是绑定model之后的modelname",
"type": "String"
}
],
"return": {
"description": "Function"
},
"example": [
"\n $Control(TestModel)\n class TestControl {\n updateTest(data,dispatch,modelJson,model){\n fetch('/test').then((data)=>{\n this.update('age',data.age)\n })\n }\n }"
],
"class": "Control"
},
{
"file": "src/control.js",
"line": 74,
"description": "更新store中某条数据,可自定义合并规则",
"itemtype": "method",
"name": "updateWith",
"params": [
{
"name": "data",
"description": "需要合并的值",
"type": "Object"
},
{
"name": "merge",
"description": "自定义合并规则方法",
"type": "Function"
},
{
"name": "modelName",
"description": "model名字,默认是绑定model之后的modelname",
"type": "String"
}
],
"return": {
"description": "Function"
},
"example": [
"\n $Control(TestModel)\n class TestControl {\n updateTest(data,dispatch,modelJson,model){\n return \n fetch('/test').then((data)=>{\n this.updateWith({\n names:['test','test1','test2']\n },function merger(prev,next){\n if( Immutable.List.isList(prev) && Immutable.List.isList(next)){\n return next\n }\n if(prev && prev.mergeWith){\n return prev.mergeWith(merger,next)\n }\n return next\n }) \n })\n \n }\n }"
],
"class": "Control"
},
{
"file": "src/control.js",
"line": 113,
"description": "插入store中某条数据",
"itemtype": "method",
"name": "insert",
"params": [
{
"name": "path",
"description": "需要被删除的属性地址,根据具体的对象结构,例如一个结构为:var data={name:'test',other:{age:18}}的对象,如果想要在data中新增一些字段应该这样:this.insert({sex:'男'})",
"type": "String"
},
{
"name": "data",
"description": "需要保存的值,新的值会覆盖之前的值",
"type": "String | object"
},
{
"name": "isImmutable",
"description": "是否将值转换为Immutable类型,默认为false,如果更新的值为object类型建议设置为true",
"type": "Boolean"
},
{
"name": "modelName",
"description": "model名字,默认是绑定model之后的modelname",
"type": "String"
}
],
"return": {
"description": "Function"
},
"example": [
"\n $Control(TestModel)\n class TestControl {\n insertTest(data,dispatch,modelJson,model){\n \n fetch('/test').then((data)=>{\n this.insert({\n sex:'男'\n })\n })\n \n }\n }"
],
"class": "Control"
},
{
"file": "src/control.js",
"line": 151,
"description": "保存store中某条数据",
"itemtype": "method",
"name": "save",
"params": [
{
"name": "path",
"description": "跟update一样",
"type": "String"
},
{
"name": "data",
"description": "需要保存的值,新的值会覆盖之前的值",
"type": "String | object"
},
{
"name": "isImmutable",
"description": "是否将值转换为Immutable类型,默认为false,如果更新的值为object类型建议设置为true",
"type": "Boolean"
},
{
"name": "modelName",
"description": "model名字,默认是绑定model之后的modelname",
"type": "String"
}
],
"return": {
"description": "Function"
},
"example": [
"\n $Control(TestModel)\n class TestControl {\n saveTest(data,dispatch,modelJson,model){\n \n fetch('/test').then((data)=>{\n this.save('age',data.age) \n })\n \n }\n }"
],
"class": "Control"
},
{
"file": "src/control.js",
"line": 184,
"description": "异步操作,<strong style=\"color:red\">IE9以下不建议使用</strong>,Sync是一个装饰器(Decorator),用于装饰Control类中的方法,将原有的方法变成一个异步成功调用后执行结果方法,被装饰的方法需要返回数据或false,决定是否更新store刷新节点。\n- 由Sync装饰后的方法,其作用域为Control,依然可以调用类中其他方法\n- Sync参数error可以为Control中xxxError命名的方法替代,“xxx”命名规则必须与Sync装饰的方法名一致\n- 被装饰后的方法在View中调用时传入的参数将已第二个为准,第一个参数将永远是异步执行后的结果\n- 被装饰的方法名要和Model类中方法名对应",
"itemtype": "method",
"name": "Sync",
"params": [
{
"name": "anywhere",
"description": "参数为一个字符串时,anywhere为url,当方法拥有2个参数,第一个参数作为url,第二个参数为object类型",
"type": "Object|string",
"props": [
{
"name": "dataType",
"description": "数据返回类型 默认为json",
"type": "String"
},
{
"name": "asyn",
"description": "是否为异步请求,默认为true",
"type": "Boolean"
},
{
"name": "method",
"description": "数据请求方式,默认为GET,可选值有:POST、GET、OPTION、DEL、PUT",
"type": "String"
},
{
"name": "timeout",
"description": "请求超时时间,可选填",
"type": "Number"
},
{
"name": "credentials",
"description": "跨域是是否要包含cookie值,可选值:include",
"type": "Object"
},
{
"name": "error",
"description": "请求失败回调,可选",
"type": "Function"
},
{
"name": "header",
"description": "包含的请求头,可选",
"type": "Object"
},
{
"name": "body",
"description": "需要传递给服务端的属性字段值,可选",
"type": "Object"
},
{
"name": "cache",
"description": "请求数据是否缓存",
"type": "Boolean"
}
]
}
],
"return": {
"description": "function"
},
"example": [
"\n import {Sync,Control} from 'gfs-react-mvc'\n\n class TestControl{\n constructor(){}\n //这里由于@为文档关键符号,所以下面将以$代替\n $Sync('/test',{\n method:'get'\n })\n save(data){\n //此处data是异步请求后服务器返回的结果\n if(data){\n //返回数据更新页面节点信息\n return data\n }\n //不做任何改变\n return false\n } \n $Sync('/del',{\n method:'get'\n })\n del(data){\n //此处data是异步请求后服务器返回的结果\n if(data){\n //返回数据更新页面节点信息\n return {\n //手动指定model对应方法\n type:this.getModelName('del'),\n data:data\n }\n }\n //不做任何改变\n return false\n }\n //也可直接使用\n $Sync()\n update(data){\n //此处data是异步请求后服务器返回的结果\n if(data){\n //返回数据更新页面节点信息\n return {\n //手动指定model对应方法\n type:this.getModelName('update'),\n data:data\n }\n }\n //不做任何改变\n return false\n }\n }"
],
"class": "Control"
},
{
"file": "src/control.js",
"line": 324,
"description": "此方法是一个装饰器,只能用于类,被装饰后的类会变成对象列表(JSON)格式,主要目的是传递给组件使用,通过redux connect连接。\n被装饰的类将成为一个控制器,处理异步数据逻辑或业务逻辑,将数据传递给视图或服务器",
"itemtype": "method",
"name": "Control",
"params": [
{
"name": "modelName",
"description": "实体类对象",
"type": "Object"
},
{
"name": "loadingbar",
"description": "废弃",
"type": "Loadingbar"
},
{
"name": "mock",
"description": "废弃",
"type": "Mock"
}
],
"return": {
"description": "object"
},
"example": [
"\n import {Sync,Control} from 'gfs-react-mvc'\n import TestModel from '../model/TestModel'\n //这里由于@为文档关键符号,所以下面将以$代替\n //@Control(TestModel)\n class TestControl{\n constructor(){}\n $action\n changeAge(){\n\n \n fetch('/test.json'[,params]).then((data)=>{\n //control中默认提供update、del、insert、save四种操作数据方法,会根据不同的control名生成,如下根据testControl生成的方法testControlUpdate\n\n dispatch(this.testControlUpdate('age','ajax改变的age:'+data.age) )\n })\n \n }\n //不建议使用下列方式\n //这里由于@为文档关键符号,所以下面将以$代替\n $Sync('/test',{\n method:'get'\n })\n $action\n save(data){\n //此处data是异步请求后服务器返回的结果\n if(data){\n //返回数据更新页面节点信息\n return data\n }\n //不做任何改变\n return false\n }\n }"
],
"class": "Control"
},
{
"file": "src/control.js",
"line": 406,
"description": "获取model方法名全名,在未传任何值时返回方法前缀",
"itemtype": "method",
"name": "getModelName",
"params": [
{
"name": "actionName",
"description": "default='',方法名,可选",
"type": "String"
},
{
"name": "isDefault",
"description": "是否获取系统中提供的方法名,默认false,可选",
"type": "Boolean"
},
{
"name": "modelName",
"description": "model名字,可选",
"type": "String"
}
],
"return": {
"description": "string"
},
"class": "Control"
},
{
"file": "src/index.js",
"line": 22,
"itemtype": "method",
"name": "page",
"params": [
{
"name": "opts",
"description": "可以直接等于react component",
"type": "Object",
"props": [
{
"name": "middleware",
"description": "可选,中间件集合",
"type": "Array"
},
{
"name": "module",
"description": "必填,需要渲染在页面的组件",
"type": "React component"
},
{
"name": "devTools",
"description": "可选,数据模型调试,可视化面板,可以查看数据模型结构",
"type": "Object"
},
{
"name": "bar",
"description": "可选,异步数据请求时加载状态栏",
"type": "Object"
},
{
"name": "debug",
"description": "可选,是否是调试状态,调试状态下会输出日志信息",
"type": "Boolean"
},
{
"name": "agent",
"description": "可选,默认值为pc,三种可选值:pc、wap、other,other已bar字段对象为准",
"type": "String"
},
{
"name": "container",
"description": "可选,默认为root,组件放在页面的容器id",
"type": "String"
}
]
}
],
"return": {
"description": "RTools"
},
"example": [
"\n imoprt {page} from 'gfs-react-mvc'\n import Module from './TestComponent'\n //渲染到页面\n page(Module)"
],
"class": "Page",
"module": "gfs-react-mvc"
},
{
"file": "src/model.js",
"line": 110,
"description": "一个类装饰器,被装饰的类会变成store,默认不需要额外提供对数据操作的方法,在control中默认会提供del、update、insert等数据操作方法;如果有特殊需求无法满足使用场景可按照example中给出的方式自行编写数据处理方法<br />\n<strong style=\"color:red\">注意:model类中`__name`属性必须要有,这是为了能在各个component正常使用model必备的一个属性,必须小写,默认会在字符串后面添加上\"model\",例如:`static __name='test'`,那么在实际中运用应该是this.props.testmodel</strong>",
"itemtype": "method",
"name": "Model",
"params": [
{
"name": "target",
"description": "被包装的对象",
"type": "Object"
}
],
"example": [
"\n\n import {Model} from 'gfs-react-mvc'\n //这里由于@为文档关键符号,所以下面将以$代替\n //@Model\n $Model\n class TestModel {\n //__name必须要有,这是为了能再各个component正常使用model必备的一个属性,必须小写\n static __name = 'testmodel'\n //数据模型\n static age = 20\n static xq = {}\n //可以自行定义数据操作方法,在control中通过\n //dispatch({\n // type:`testmodel$$save`,\n // data:data\n //})\n //这种方式变更数据,其中type值的组成是通过:类名(全小写)+ 方法名组成\n static save(data, action){\n if(action.data){\n return data.merge(Immutable.fromJS(action.data) )\n }\n }\n //dispatch({\n // type:`testmodel$$del`,\n // data:data\n //})\n static del(data, action){\n if(action.data){\n return data.merge(Immutable.fromJS(action.data) )\n }\n }\n }"
],
"class": "Model",
"module": "gfs-react-mvc"
},
{
"file": "src/view.js",
"line": 8,
"description": "一个装饰器方法,用于装饰类,被装饰的类为页面视图,或者说是react的component,并不是每一个component都需要被装饰",
"itemtype": "method",
"name": "View",
"params": [
{
"name": "action",
"description": "control对象,可以是一个数组,比如:View([TestControl,Test2Control] )",
"type": "Object"
}
],
"return": {
"description": "class"
},
"example": [
"\n\n import {View} from 'gfs-react-mvc'\n import TestControl from './TestControl'\n //这里由于@为文档关键符号,所以下面将以$代替\n //@View(TestControl)\n $View(TestControl)\n class TestComponent extends Component {\n constructor(props) {\n super(props)\n }\n\n componentDidMount(){\n setTimeout(()=>{\n //调用control中的action\n this.props.save(this)\n },1000)\n }\n\n static defaultProps={}\n\n render() {\n console.log('age:',this.props.testmodel.get('age') )\n return (\n <div>\n {this.props.testmodel.get('age')}\n </div>\n )\n }\n }"
],
"class": "View",
"module": "gfs-react-mvc"
}
],
"warnings": []
}