UNPKG

pwfe-dom

Version:
395 lines (352 loc) 16.3 kB
# pwfe-dom palmg基础前端react组件基础工程。 ----- pwfe—palmg web front end。 ----- ## 安装 `npm install pwfe-dom` ### sass-node安装异常 当nodejs版本较低时,安装node-sass会出现异常,请使用cnpm执行: ```bash $ npm rm node-sass $ cnpm install node-sass ``` 详情请查看:https://github.com/sass/node-sass/issues/468 ## 规范 **pwfe**中的所有前后端组件统一使用标准的`routes`列表作为路由配置: ```JavaScript [{ id: 'comp1', //页面id,在列表中唯一 url: '/', //页面对应的URL name: '演示文稿', //页面名称,会渲染到title媒体属性中 component: (call)=> { //加载组件的回调 require.ensure([], require => { call(require('./sub/comp1')) }, 'comp1') } }] ``` ***参数说明***: 接口 | 说明 ------------ | ------------- id | 表示该页面的唯一标识,在内部用于匹配和实现前后端同步渲染。 url | 页面对应的url。可以为`/path/name``/path/name/:params`的形式 name | 页面显示在浏览器title的名称。 component | 获取组件的回调方式。一般是(cb)=>{cb(Component)}的方式,无论通过什么方式获取React组件,最后使用cb(component)来返回。例如上面使用了require.ensure规范。 ## 组件说明 ### bundle 页面分片高阶组件。该组件配合`routes`用于实现页面分片。 ```JavaScript import bundle from 'pwfe-dom/bundle' <div>bundle(initComp, getComp)</div> ``` **参数说明** 接口 | 类型 | 说明 ----- | ---- | --- initComp | Element | 优先初始化的组件。当传入该参数时,表示不必使用第二个参数的get回调去获取参数。而直接使用这个组件。 getComp | function | 异步获取参数的回调方法。该方法会在组件开始渲染时被调用。传入另外一个回调方法,实现异步加载。例如`(cb)=>{cb(require('./page'))}`,在获取组件后调用cb返回。 ### App App是用于前后端同构的入口,app中会调用bundle进行分片渲染。如果在业务工程中有特别需要,可以以app组件以模板进行二次开发。 ```JavaScript import React from 'react' import {render} from 'react-dom'; import App from 'pwfe-dom/app' render( (<App className={className} init={{comp:comp, id: initID}} routes={routes}> <Children /> </App>), document.getElementById('root') ) ``` **参数说明** 接口 | 类型 | 说明 ----- | ---- | --- init | object | 系统初始化渲染参数。对象中包含2个参数:`comp``id`。<br>`comp`:初始化渲染的页面组件,一般用于前后端同构渲染。这个组件会在第一次渲染之前就传入,放置前后端首屏异构。<br>`id`:初始渲染组件对应的路由表id。 routes | arrya | 路由列表。结构请看规范中的routes说明。 className | string | app组件样式。所有App中的子元素都会被一个`div`标签包裹,传入className可以设定这个`div`对应的样式。 children | react Element | App的子元素。会在路由内容之前显示该内容。 header | react Element | App头部元素。例如可以设定`Link`元素。 header | react Element | App页脚元素。用于全站统一显示页脚信息。 ### entry entry是提供前端入口的全局组件。与后端的serverApp组件对应。用于实现前端同构渲染功能。entry中使用默认的App和bundle实现了页面渲染和分片加载。如果有特殊的业务需求,可以使用自定义的App ```JavaScript import entry from 'pwfe-dom/entry' entry({ reducer: reducer, routes: routes, children: (<div> <Link to="/">comp1</Link> <Link to="/comp2">comp2</Link> </div>), className: cn('demo'), renderCb: ()=> { console.log('render success!') } }) ``` **参数说明** 接口 | 类型 | 说明 ----- | ---- | --- reducer | object | redux对应使用的reducer。结构为`{key:function(){}}` routes | array | **routes**列表,详见前文的**routes**说明 app | Element | 用于前后端同构渲染的组件。该App会被传入`init`参数和`routes`参数。不设置默认使用`pwfe-dom/app`组件 header | Element | 在app中显示的头部元素,如果传入了自定义的app,则会传入到props.header中,组件会在children之前显示。 children | Element | 在app中显示的子元素,如果使用了自定义App组件,则会传入到props.children中。 footer | Element | 在app中显示的头部元素,如果传入了自定义的app,则会传入到props.footer中,组件会在routes之后显示。 className | string | app组件显示的样式,如果使用自定义的App组件,则会传入到props.className中。 renderCb | function | 渲染成功的回调方法 ## tag tag组件包含一系列对源生HTML标签进行扩展的组件:`Img``Icon``DynaIcon``A`。此外还提供了针对动态图片的设置功能——`setIcon`### Img `Img`用于替换源生的html`<img/>`标签。目前还未实现Img的特性。计划实现的特性包括: 1. 实现图片滚当到可视区域加载。 2. 实现图片低清图和高清图分步加载。 3. 实现图片质量控制,配合后台文件服务器控制图片的大小、分辨质量等。 ```JavaScript import Tag from 'pwfe-dom/tag' <Tag.Img src="myPic" className="myStyle"/> ``` 接口 | 说明 ------ | ------ all | Img组件支持所有`<img/>`源生属性和方法。参见:https://github.com/palmg/react-scroll-over-img#readme ### Icon `Icon`用于展示所有站内图标,它的作用是将资源文件和代码部分隔离开,然后异步加载,不影响业务执行。 1. 标签组件需要绑定资源路径使用,每增加一个图片,都需要增加一个资源引用。资源文件通过Tab.Icon设置(后文有介绍) 2. src参数传递的是资源标记,例如资源项 img={logo:"base64:adf"},此时传入的src="logo"```JavaScript import Tag from 'pwfe-dom/tag' <Tag.Icon src="myPicName" className="myStyle"/> ``` 接口 | 说明 ------ | ------ all | Icon组件支持所有`<img/>`源生属性和方法。 src | 与标准`<img/>`不同是,这里的src传入的是一个资源文件名称。详见`Tag.setIcon`部分说明。 ### DynaIcon 支持激活特性的`Icon`组件。使用方式和`Icon`组件一样。 ```JavaScript import Tag from 'pwfe-dom/tag' <Tag.DynaIcon src="myPicName" actSrc="myActPicName" act/> ``` 接口 | 类型 | 说明 ----- | ---- | --- all | object | 组件支持所有`<img/>`源生属性和方法。 src | string | 未激活时要显示的图标,src传入的是一个资源文件名称。详见`Tag.setIcon`部分说明。 actSrc | string | 激活后要显示的图标,actSrc传入的是一个资源文件名称。详见`Tag.setIcon`部分说明。 act | boolean | 是否激活标记true标识激活,需要动态传入。默认为false ### A 类同于HTML源生的`<a>`标签。提供控制浏览器端跳转和服务端跳转的特性。 ```JavaScript import Tag from 'pwfe-dom/tag' <Tag.A href="/path/name" server/> ``` 接口 | 类型 |说明 ----- | ---- | --- href | string | 要跳转的路径。 server | boolean | 标记是否通过服务器跳转,默认为false。 ### setIcon 用于设置系统图标。该工具方法用于设置`Icon`的数据。当图标未初始化时,`Icon`组件所有的实例都只显示默认的空白图片,当调用`setIcon`方法设置图标后,所有的图片都会更新为`Icon`组件src名称对应的图标。 `setIcon`设定的图标数据为扁平化对象结构: ```JavaScript { myPicName:Base64Data= myAvatarName:Base64Data= } ``` 在代码的任意位置都可以使用setIcon方法来设置图标,以实现分片、异步等加载方法,例如下面的代码实现了分片在家独立的img模块: ```JavaScript import Tag from 'pwfe-dom/tag' require.ensure([], require => { Tag.setIcon(require("./res/img")) }, 'res') ``` 而在**"./res/img"**模块中,可以这样设定图片: ```JavaScript /** * 通过import或require引入图片,会将图标转换为base64。 */ import logo from './icon/logo.png' const img = { logo } module.exports = img ``` **注意**,上面的代码需要设定webpack的图片loader。例如: ``` { test: /\.(png|jpg|svg)$/, use:['url-loader?limit=25000'] } ``` 接口 | 类型 |说明 ----- | ---- | --- img | object | 设定img的资源对象。 defImg | string | 设定默认图片。 ## flux `flux`提供了redux相关的支持功能。提供的接口包括`buildStore``getStore`### buildStore `buildStore`提供构建[store][1]实例的功能。 ```JavaScript import {buildStore} from 'pwfe-dom/flux' const store = buildStore(reducer, window.REDUX_STATE) ``` 接口 | 类型 |说明 ----- | ---- | --- reducer | object | 设定`redux`的[reducer][2]。其结构为`{reducerName:function()}。 loaderStore | object | 设定已有的store对象,一般用于前后端同构渲染。 ### getStore 获取[store][1]实例。需要先运行`buildStore`创建才能获取,否则返回`'undefined'` ```JavaScript import {getStore} from 'pwfe-dom/flux' const store = getStore() ``` 除了直接使用`import {getStore} from './flux'`方式引入,还可以引入全局`flux`对象: ```JavaScript import flux from 'pwfe-dom/flux' const store = buildStore(reducer, window.REDUX_STATE) const store = getStore() ``` ### dispatch 执行`action`更新[store][1]的数据,使用前必须先使用`buildStore`构建[store][1]。 ```JavaScript import {dispatch} from 'pwfe-dom/flux' const store = buildStore(reducer, window.REDUX_STATE) const store = dispatch(action(data)) ``` ### subscribe 用于监听[store][1]的变化,使用前必须先使用`buildStore`构建[store][1]。 ```JavaScript import {subscribe, getStore} from 'pwfe-dom/flux' const store = buildStore(reducer, window.REDUX_STATE) const store = subscribe(()=>{ console.log('current store' , getStore().getState()) }) ``` ### 设置日志输出等级 可以通过webpack的DefinePlugin设定redux的日志输出等级。通过以下方式设置: ```JavaScript new webpack.DefinePlugin({ __FluxLogLevel:"'None'" //JSON.stringify('None') }) ``` 设置变量说明 值 |说明 ----- | ---- 'None' | 什么日志也不输出 'Detail' | 输出Redux变更的详细日志,包括:变更之前的数据状态,变更之后的数据状态,以及变更的值。 ## net 提供前后端异步请求的功能。前端请求用ajax实现、后台请求使用nodejs提供的http包实现。`net`模块中提供`net`、`get`和`post`方法。所有的请求返回一个`serverNetwork`实例或一个`browserNetwork`实例。通过函数式的方式来获取数据,回调提供3个方法`suc`、`err`,`headers`,例如: ```JavaScript import {net,get,post} from 'pwfe-dom/net' net({ method: 'GET', url: '/myPath/value' }).suc((data)=>{}) .err((err,msg)=>{}) .headers((header)=>{}) get('/myPath/value') .suc((data)=>{}) .err((err,msg)=>{}) .headers((header)=>{}) post('/myPath/value',{key:'kye',value:'value'}) .suc((data)=>{}) .err((err,msg)=>{}) .headers((header)=>{}) ``` ### net方法 net传递的是一个options对象——`net(options)`。下面是options的参数: 接口 | 类型 | 说明 ----- | ----- | ----- method | string | 请求的方法`GET`或`POST`。 url | string | 请求地址。 data | object或string | 要传递的数据。可以是一段字符串,或者是一个JSON结构的对象。 header | object | 请求的头部,格式为:`{"Accept":"application/json"}`。 query | object | 请求的查询字段,类似的get请求的?参数。 withCredentials | boolean | 标记是否跨域传递cookie。为了便于在测试环境中全局使用,可以在webpack中全局配置__WithCredentials=true ### get方法 GET请求。 接口 | 类型 | 说明 ----- | ---- | --- url | string | 请求地址。 query | object | 请求的查询字段,类似的get请求的?参数。 ### post方法 POST请求。 接口 | 类型 | 说明 ----- | ---- | --- url | string | 请求地址。 query | object | 请求的查询字段,类似的get请求的?参数。 ### router *router* 提供路由、链接、跳转、重定向等功能。模块包含的组件有:`Route`, `Router`, `reRoute`, `Link`, `Redirect`, `StaticRouter`。 其中`Route`, `Router`, `Link`, `Redirect`, `StaticRouter` 基于`react-route`实现。请参看对应的说明。 1. `Route`:https://reacttraining.com/react-router/web/api/Route 2. `Router`:https://reacttraining.com/react-router/web/api/Router 3. `Link`:https://reacttraining.com/react-router/web/api/Link 4. `Redirect`: https://reacttraining.com/react-router/web/api/Redirect 5. `StaticRouter`:仅用于后台渲染。https://reacttraining.com/react-router/web/api/StaticRouter。 `reRoute`是一个提供路由控制功能的高阶组件。采用react高阶组件的方式使用: ```JavaScript const MyComponent = reRoute()(props=>{ const browser = props.browser; //获取browser对象来操作路由 return(<div>组件</div>) }) ``` browser提供了多个路由方法和属性值: 接口 | 说明 ----- | ---- local | 通过服务器跳转。跳转石会访问服务器,浏览器重新刷新页面。原有的内存数据会丢失。<br> 调用方法:`browser.local('/myPath')` forward | 浏览器向前跳转,使用该方法时不会发生服务器请求,只会发生react组件替换。<br>若不传入url参数,则浏览器会发生前进一页的行为。<br>若传入url参数,浏览器会自行跳转到对应url。<br>调用方法:`browser.forward('/myPath')` back | 浏览器回滚,不会发生服务器请求。<br>调用方法:`browser.back() path | 获取当前页面的访问的相对地址。如http://domain(:port)/myPath/myParam 调用`browser.path()`会返回`'/myPath/myParam'`。**如果在routes中将路径配置为`/myPath/:pamram`,则获取到的数据为`/myPath/:pamram`** url | 获取当前页面的访问的相对路径。如http://domain(:port)/myPath/myParam 调用`browser.path()`会返回`'/myPath/myParam'`。**如果在routes中将路径配置为`/myPath/:pamram`,则获取到的数据为`/myPath/myParam`** ### 设置history的类型 可以通过webpack的DefinePlugin设定react-route的history类型。通过以下方式设置: ```JavaScript new webpack.DefinePlugin({ __History:"'Browser'" //JSON.stringify('Browser') }) ``` 设置变量说明 值 |说明 ----- | ---- 'Hash' | 类似于http://domain(:port)/#/path这样格式的URL。可参看关于hash的说明:https://reacttraining.com/react-router/core/api/history 'Browser' | 标准的浏览器格式:http(s)://domain(:port)/path ## util **util**提供了最基础的工具。包括`getComponentName`、`isServerEvn`、`asyncLoader`和`safeGetValue`。 方法 | 说明 ----- | ---- getComponentName | 获取react组件的名称。 isServerEvn | 获取当前的运行环境是服务器端还是浏览器端。 asyncLoader | 异步加载类。用于等待某一项任务完成,然后通知所有的处理器。 safeGetValue | 从对象中安全获取属性。 isElement | 判断当前内容是一个React的类还是一个元素(实例)。 案例: ```JavaScript //import util from 'pwfe-dom/util' 全局引用 import {getComponentName} from 'pwfe-dom/util' console.log(getComponentName(component)) ``` `asyncLoader`使用方法: ```JavaScript //import util from 'pwfe-dom/util' 全局引用 import {asyncLoader} from 'pwfe-dom/util' /** * 新建一个asyncLoader实例。 * 新建时传入回调方法,表示需要加载的内容。 * call由asyncLoader传入,加载的内容成功后,需要调用call方法 */ const loader = new asyncLoader({ loader: (call)=> { require.ensure([], require => { call(require('superagent')) }, 'request') } }) //注册一个处理器, //当第一个处理器被调用时,上面传入的loader方法会被触发。 //laoder方法执行回调之后 // loader.register((result)=>{ console.log(resule) }) ``` [1]: http://cn.redux.js.org/docs/basics/Store.html [2]: http://cn.redux.js.org/docs/basics/Reducers.html