微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React 教程第十五篇 —— 项目应用

实现

该案例是以中间件调用 nodejs 的公共接口,实现一个数据列表。

源码下载:https://github.com/dk-lan/rea...

效果预览

用户名和密码都为空

源码下载后执行下面步骤例可查看效果

  • npm install
  • npm start

Redux 中间件的问题之作用域

在 Redux 中使用中间件可以解决很多问题,但也会有个致命的问题,那就是在同一个组件中多次调用一个组件,那就会造成作用域污染。

本案例中是这样的场景:

  • 现在要实现在组件cnode中动态加载数据,在该组件中还会有一个输入框,点击时弹窗动态加载一个数据列表,双击数据列表进行填充到对应的输入框中
  • 一个组件datagrid,用于动态加载数据,ajax 加载使用了中间件。
  • 一个组件modal,该组件用到弹窗加载一个数据列表datagrid
  • 在组件cnode调用了组件datagrid<Datagrid config={this.props.cnode.config}/>
  • 在组件cnode中同时调用了组件modal,而组件modal调用了组件datagrid
  • 这个时候两个datagrid的数据源就会冲突,后面加载的数据冲突了前面加载的。
  • 解决方案是在数据源中对数据源作用域隔离

对象作用域隔离

每次调用组件datagrid时给一个别名name,别名不能重复,用于作用域隔离

static defaultProps = {
    cnode: {
        config: {
            url: 'https://cnodejs.org/api/v1/topics',data: {page: 1,limit: 10},cols: ['title','reply_count','top','create_at','last_reply_at'],name: 'cnode'
        }           
    },modal: {
        config: {
            type: 'datagrid',url: 'https://cnodejs.org/api/v1/topics',data: {page: 3,limit: 5},cols: ['title'],name: 'modal'
        } 
    }
}

Action 中将别名name派发到中间件

export function refresh(_config){
    return {
        types: [constants.Requesting,constants.Requested,constants.RequestError],url: _config.url,method: _config.method || 'get',data: _config.data || {},name: _config.name
    }
}

在中间件将别名name一派发到Reducer

let _action = {
    type: constants.Requested,name,result: res.data
}
dispatch(_action)

Reducer中兼容有别名和没别名的情况,如果有别名,就将数据源作用域隔离

if(action.name){
    _state[action.name] = _state[action.name] || {};
    _state[action.name].dataset = action.result;
} else {
    _state.dataset = action.result;
}

DatagridComponent中判断是否有别名,兼容有别名和没别名的情况,分别操作不同的数据源

let ds = this.props.dataset;
let name = this.props.config.name;
if(name){
    ds = ds[name] ? ds[name].dataset : []
} else {
    ds = ds.dataset || [];
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...