浅谈React和VDom关系
组件化
- 组件的封装
- 组件的复用
组件的封装
- 视图
- 数据
- 视图和数据之间的变化逻辑
import React, {Component} from 'react';export default class List extends Component{constructor(props){super(props);this.state = { //数据list:this.props.data,}}render() { return (<div> <ul>{this.state.list.map(function(item,index){return (<li key={index}>{item}</li>);})}</ul></div>)}
}
组件的复用(通过props传递)
import React, {Component} from 'react';
import List from './list'; //组件
import Title from './title';//组件
export default class Todo extends Component{constructor(props){super(props);this.state = {list:['Foo','Bar'],}}todoList (item){this.state.list.push(item);const newList=this.state.list;this.setState({list:newList,})}render() {return (<div><Title todoList={this.todoList.bind(this)} /> <List data={this.state.list}/><Title todoList={this.todoList.bind(this)} /> //复用<List data={[1,2,3]}/> //复用</div>)}
}
JSX
React引入JSX,并将它作为了一个独立的标准开放,React.createElement也是可以自定义去修改的,
jsx语法(语法糖)需要转成js
ReactElement createElement( // 参数——标签\属性\子元素string/ReactClass type, [object props], [children ...]
)
npm i babel-cli -g
npm i --save-dev babel-plugin-transform-react-jsx
新建.babelrc文件,添加
{"plugins": ["transform-react-jsx"]
}
在项目根目录中运行babel --plugins transform-react-jsx src/components/todo/index.js
经过编译:转化成React.createElement,类似于vitual dom 的 h 函数
import React, { Component } from 'react';
import List from './list'; //组件
import Title from './title'; //组件
export default class Todo extends Component {constructor(props) {super(props);this.state = {list: ['Foo', 'Bar']};}todoList(item) {this.state.list.push(item);const newList = this.state.list;this.setState({list: newList});}render() {return React.createElement('div', //直接渲染null,React.createElement(Title, { todoList: this.todoList.bind(this) }), //转化成React.createElementReact.createElement(List, { data: this.state.list }), //List 是自定义构造函数,List 组件必须有renderReact.createElement(Title, { todoList: this.todoList.bind(this) }),React.createElement(List, { data: this.state.list }));}
}
React.createElement(List, { data: this.state.list }), //List 是自定义构造函数,List 组件必须有render
相当于var list = new List({data: this.state.list});
var vNode = list.render(); //通过层层的render函数,最终React.createElement html标签
在文件开始添加 /* @jsx h */ 改变 React.createElement
/* @jsx h */
import React, { Component } from 'react';
import List from './list'; //组件
import Title from './title'; //组件
export default class Todo extends Component {constructor(props) {super(props);this.state = {list: ['Foo', 'Bar']};}todoList(item) {this.state.list.push(item);const newList = this.state.list;this.setState({list: newList});}render() {return h('div',null,h(Title, { todoList: this.todoList.bind(this) }),h(List, { data: this.state.list }),h(Title, { todoList: this.todoList.bind(this) }),h(List, { data: this.state.list }));}
}
JSX中的VDom体现
jsx就是模版,最终需要转化成html,初次渲染,修改state后的setState 的re-render,正好适用于vDOM
ReactDOM.render(<App />, document.getElementById('root')); //初次渲染 <App /> JSX对象
//通过vDom的patch(container,vnode),而对于re-render是通过setState
todoList (item){this.state.list.push(item);const newList=this.state.list;this.setState({ //re-render patch(vnode,newVnode)list:newList,})
}
源码下载
该随笔相关代码已上传到github,地址:https://github.com/10086XIAOZHANG/ReactVisualDomDemo
转载于:https://www.cnblogs.com/fuGuy/p/9226248.html
浅谈React和VDom关系相关推荐
- 【转】浅谈React、Flux 与 Redux
本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成 ...
- 浅谈 React 生命周期
浅谈 React 生命周期 浅谈 React 生命周期 旧版的生命周期 新版的生命周期 详解各个生命周期函数 constructor getDerivedStateFromProps render c ...
- 浅谈react和vue
浅谈React 和 Vue 相同之处: React 和 Vue 有许多相似之处,它们都有: · 使用 Virtual DOM · 提供了响应式 (Reactive) 和组件化 ...
- 【转载】浅谈React编程思想
React是Facebook推出的面向视图层开发的一个框架,用于解决大型应用,包括如何很好地管理DOM结构,是构建大型,快速Web app的首选方式. React使用JavaScript来构建用户界面 ...
- 浅谈 React Fiber
2016 年都已经透露出来的概念,这都 9102 年了,我才开始写 Fiber 的文章,表示惭愧呀.不过现在好的是关于 Fiber 的资料已经很丰富了,在写文章的时候参考资料比较多,比较容易深刻的理解 ...
- 浅谈React虚拟DOM
为什么要使用虚拟DOM 因为浏览器的DOM渲染是非常消耗性能的,很低效,我们使用虚拟DOM是为了提高DOM的渲染性能: 什么是虚拟DOM 虚拟DOM就是把真实的DOM树通过createElement转 ...
- Java防止Xss注入json_浅谈 React 中的 XSS 攻击
作者:陈吉 转发链接:https://mp.weixin.qq.com/s/HweEFh78WXLawyQr_Vsl5g 前言 前端一般会面临 XSS 这样的安全风险,但随着 React 等现代前端框 ...
- 戴尔为例 浅谈电子商务时代客户关系管理
计算机互联网技术的发展也为现代客户关系管理实现更完善的功能提供了可能性.精明的企业目前都在认真反省自己的CRM战略,并开始把CRM作为它们挽留客户的重要手段,希望凭借CRM的智能客户管理给企业带来忠实 ...
- 浅谈CPU 硬盘 内存关系
计算机,大家都知道的,就是我们日常用的电脑,不管台式的还是笔记本都是计算机.那么这个看着很复杂的机器由哪些组成的呢,今天就简单的来了解一下. 先放图: 图上展示的就是计算机的基本组成啦. 首先是输入设 ...
最新文章
- 直击2019WAIC丨李德毅:人工智能是脱离意识的工具,需要约束的是人类自己
- mysql 优化器代码_Mysql查询优化器
- 【风险管理】风控一二三
- JVM:-Xmx和-Xms应该维持什么样的比例?
- [BUUCTF-pwn]——wustctf2020_name_your_dog
- ef mysql modelfirst_Entity Framework(EF的Model First方法)
- Java抽象– ULTIMATE教程(PDF下载)
- 23种设计模式之访问者模式
- Python查看本机所有联网应用程序信息
- C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别?
- 暴风影音 打开 avi 视频文件时 explorer 出错 关闭
- 《Maya 2009高手之路》-115网盘下载
- HTTP协议和SOCKS5协议
- 可视化html css布局,一个开源可视化布局项目,在线生成纯css布局,可阅读的代码...
- Hungry for your love 真爱无限
- 【武忠祥高等数学基础课笔记】定积分
- java socket 循环读取_java socket tcp(服务器循环检测)
- python输出emoji表情符号 学习笔记
- 中国程序员最容易发错的单词
- 电商不仅仅有CRUD——0基础了解电商中的引流工具谷歌GMC