react组件渲染的一些想法

  最近一直在思考一个问题,react的单向数据流面对深层次组件集合(redux connect方法返回的组件,即一项完整的功能)时,数据该如何传递???redux帮助我们解决了什么问题???

  我使用了redux+react,发现redux并没有解决react组件之间数据传递问题。只是把数据中心化与避免了父组件取子孙组件的数据时那繁琐的回调,却增加了三个麻烦的东西action、reducer、mapStateProps。复杂的处理流程:action里新增一条数据,reducer就需要增加一个对该数据处理的方法(一般是合并数据,东拼西凑的维护起来略感吃力),再由mapStateProps过滤后传递到组件中。一个很简单的操作用了redux后就会变得很复杂(恶心到爆)!有时候你只想改变组件集合里面一个子组件状态,dispatch后他会把整个组件集合从头到尾渲染一遍(多浪费性能),虽然可以通过componentshouldupdate解决该性能问题,但是觉得好麻烦!不过我们也可以对每个需要独立改变状态的组件都connect一次,这样connect会很频繁,而导致代码沉余,action组织起来也会比较困难。

  redux的数据中心化我感觉真的没有必要,因为视图与视图显示的数据本来就需要绑在一起的。redux把数据与视图分离后,阅读起来好吃力:首先要查看组件的事件更新数据的方法--->在action找到更新数据的方法(查看数据源)--->然后再看reducer做了什么处理(好麻烦,难追踪,而且数据中心化后得到的好处我没有发现),我比较喜欢一个事件里有直观的数据操作。所以一直不明白为什么作为前端要把数据集中起来处理?

  我想了很久,发现一个组件集合(完整的一项功能)一般情况下只需要把数据初始化一遍。而组件进行的交互一般不会改变组件集合里的所有状态,一个交互只会改变组件集合里一个或者两个的子组件状态。所以我希望当我需要改变一个组件状态时,可以直接改变该组件的状态。这样做组件之间频繁的数据传递就会减少,只有数据初始化的时候才可能需要深层次的数据传递,那怎么做呢???我的思路是把整个页面的所有this.setState()方法收集到一个全局变量下面提供给该页面的所有组件调用,初始化数据由this.props传递!this.props里的所有数据都可以作为组件的初始状态,也可以通过initData该属性设置初始化状态。

 //collectSetState.js 1 import{Component} from "react";
 2 //改变react基类,设置默认的constructor
 3 export default class newComponent extends Component{
 4     constructor(props){
 5         super(props);
 6         getSetState.call(this);
 7     }
 8 }
 9 //收集所以的setState方法
10 export function getSetState(){
11     this.state=this.props.initData||this.props; //设置该组件的初始化数据
12     window.RX=window.RX?window.RX:{};    let name=this.constructor.name;
13     window.RX[name]=(callback)=>{ //以组件名命名setState方法       window.RX[name].getState=()=>this.state;14         this.setState(Object.assign({},this.state,callback.call(this)));   //组合state
15     }
16 }

例子:

 1 import ReactDOM from "react-dom";
 2 import React from "react";
 3 import Component,{getSetState} from "./collectSetState.js"; //改造后的基类组件(构造方法会默认的收集该组件的setState方法)
 4 class App01 extends Component{
 5     constructor(props){
 6         super(props);
 7         getSetState.call(this)   //自定义构造时可用通过getSetState收集setState方法
 8     }
 9     render(){
10         return <h1>{this.state.content}</h1>;
11     }
12 }
13 class App02 extends Component{
14     mapChild(){
15         return this.state.data.map((item)=>{
16             return <p>{item+this.state.content}</p>;
17         })
18     }
19     render(){
20         return <div>
21                     <h1 >{this.state.content}</h1>
22                     {this.mapChild()}
23                 </div>
24                 ;
25     }
26 }
27 class Controller extends Component{
28     clickHandler(e){
29         RX[e.target.value](function(){   //根据组件名来使用收集的setState方法
30             return {
31                 content:(this.state.content+1)||0, //返回修改的状态
32             }
33         })
34     }
35     render(){
36         return <div>
37         <input type="button" value="App01" onClick={this.clickHandler.bind(this)}/>
38         <input type="button" value="App02" onClick={this.clickHandler.bind(this)}/>
39         </div>;
40     }
41 }
42 ReactDOM.render(
43     <div>
44         <Controller />
45         <App01 content={1} /> //初始化数据放在props
46         <App02 content={2} initData={[1,2,3,4,5]}/>
47     </div>,
48     document.getElementById("container")
49 )

  最后,希望各位大大能给我指点迷津。刚学不久,可能对react与redux理解还不够透切,还不清楚这个想法的弊端在哪里!!!求指教......

  

时间: 2024-10-29 19:11:47

react组件渲染的一些想法的相关文章

react+redux渲染性能优化原理

大家都知道,react的一个痛点就是非父子关系的组件之间的通信,其官方文档对此也并不避讳: For communication between two components that don't have a parent-child relationship, you can set up your own global event system. Subscribe to events in componentDidMount(), unsubscribe in componentWillU

React 组件性能优化探索实践

转自:http://www.tuicool.com/articles/Ar6Zruq React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效.然而其组件渲染机制,也决定了在对组件进行更新时还可以进行更细致的优化. react组件渲染 react的组件渲染分为初始化渲染和更新渲染. 在初始化渲染的时候会调用根组件下的所有组件的render方法进行渲染,如下图(绿色表示已渲染,这一层是没有问题的): 但是当我们要更新某个子组件的时候,如下图的

React可以渲染html标签 或React组件

React 的 JSX 使用大.小写的约定来区分本地组件的类和 HTML 标签.既渲染html标签需要使用小写字母开头的标签名而渲染本地React组件需要使用大写字母开头的标签名 注意: 由于 JSX 就是 JavaScript,一些标识符像 class 和 for 不建议作为 XML 属性名.作为替代,React DOM 使用 className 和 htmlFor 来做对应的属性.

2017.11.7 ant design - upload 组件的使用, react 条件渲染以及 axios.all() 的使用

一.主要任务:悉尼小程序管理后台,添加景点页面的开发 二.所遇问题及解决 1. 上传多个不同分类音频信息时,如中文音频和英文音频,要求音频不是放在一个数组中的,每个音频是一个独立的字段,此时: <Upload action="/hserve/v2/file/upload/" // 必选参数,上传的地址: listType="picture" // 上传列表的内建样式,这个不是很明白 text.picture.picture-card 之间的区别,默认值为 te

二、React初体验之React组件创建

(中间因为应付各种考试,处理其他事情,隔了好时间没更新,现在终于有时间了,续上!) 本文为React初始体验,因此先不考虑文件如何组织,尽量以最简单的方式让大家了解React其中的原理. 在创建组件(component)之前,大家首先需要了解一些基础知识.有ES6.JSX语法等基础知识的同学请跳过下面一段. ES6是JavaScript的最新标准,里面新增了许多语法方式,甚至出现了“类”的继承方式,我个人暂且把他们理解为新增了许多“语法糖”,这些“语法糖”可能带给老手的是方便,而对于我们这些菜鸟

React组件性能优化

转自:https://segmentfault.com/a/1190000006100489 React: 一个用于构建用户界面的JAVASCRIPT库. React仅仅专注于UI层:它使用虚拟DOM技术,以保证它UI的高速渲染:它使用单向数据流,因此它数据绑定更加简单:那么它内部是如何保持简单高效的UI渲染呢? React不直接操作DOM,它在内存中维护一个快速响应的DOM描述,render方法返回一个DOM的描述,React能够计算出两个DOM描述的差异,然后更新浏览器中的DOM. 就是说R

React 组件之间如何交流

原文  http://blog.51yuekan.com/2015/07/23/2015-07-19-react-component-communicate/ 主题 React 前言 今天群里面有很多都在问关于 React 组件之间是如何通信的问题,之前自己写的时候也遇到过这类问题.下面是我看到的一篇不错英文版的翻译,看过我博客的人都知道,我翻译可能不会按部就班,会尽可能用中文的意思,来将作者要讲述的技术描述清楚.英文能力有限,如果有不对的地方请跟我留言,一定修改--^_^ 原著序 处理 Rea

玩转 React 服务器端渲染

React 提供了两个方法 renderToString 和 renderToStaticMarkup 用来将组件(Virtual DOM)输出成 HTML 字符串,这是 React 服务器端渲染的基础,它移除了服务器端对于浏览器环境的依赖,所以让服务器端渲染变成了一件有吸引力的事情. 服务器端渲染除了要解决对浏览器环境的依赖,还要解决两个问题: 前后端可以共享代码 前后端路由可以统一处理 React 生态提供了很多选择方案,这里我们选用 Redux 和 react-router 来做说明. R

React 组件基本使用

React 提供了两种方式来声明组件,一种是函数式,一种是类式,就是用es6 class, 我们所有的组件都继承自React.Component. 函数式很简单,就像我们平常写函数一个,接受一个参数作为输入,然后进行相应的输出,只不过它输出的jsx. // welcome 函数式组件. function Welcome(props) { return <h1> {props.name}</h1> } 类式 写法如下: class Welcome extends React.Comp