浅谈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.createElement
React.createElement(List, { data: this.state.list }), //List 是自定义构造函数,List 组件必须有render
React.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
浅谈React和VDom关系的更多相关文章
- 【转】浅谈React、Flux 与 Redux
本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成 ...
- 浅谈React
浅谈react react是什么?其官网给出了明确定义:A JavaScript library for building user interfaces,一个用于构建用户界面的JavaScript库 ...
- 浅谈React工作原理
浅谈React工作原理:https://www.cnblogs.com/yikuu/p/9660932.html 转自:https://cloud.tencent.com/info/63f656e0b ...
- 浅谈React数据流管理
引言:为什么数据流管理如此重要?react的核心思想就是:UI=render(data),data就是我们说的数据流,render是react提供的纯函数,所以用户界面的展示完全取决于数据层.这篇文章 ...
- 浅谈 React、Flux 与 Redux
React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化利用 props 形成单向的数据流根据 state 的变化来更新 view利用虚拟 DOM 来提升渲染性能 ...
- 浅谈React受控与非受控组件
背景 React内部分别使用了props, state来区分组件的属性和状态.props用来定义组件外部传进来的属性, 属于那种经过外部定义之后, 组件内部就无法改变.而state维持组件内部的状态更 ...
- 浅谈react的初步试用
现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...
- 浅谈React编程思想
React是Facebook推出的面向视图层开发的一个框架,用于解决大型应用,包括如何很好地管理DOM结构,是构建大型,快速Web app的首选方式. React使用JavaScript来构建用户界面 ...
- (进阶篇)浅谈COOKIE和SESSION关系和区别
COOKIE介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 coo ...
随机推荐
- 类型同时存在于A.dll和B.dll中的解决办法
引用B.dll后,右键引用中的B.dll属性->别名->Test using的最前面加上 extern alias Test; 使用 Test.MyClass.DoSth();
- inline-block元素,在同一行上下显示
两个元素使用了inline-block,并列显示时,会上下显示,给人感觉不在同一行 原因:其中一个元素使用了overflow:hidden,导致了基线变更 解决:1.另一个元素也添加overflow: ...
- html中块级元素和行内元素
块级元素和行内元素的三个区别 1.行内元素与块级元素直观上的区别: 行内元素会在一条直线上排列,都是同一行,水平方向排列 块级元素独占一行,垂直方向排列.块级元素从新行开始结束接着一个断行 2.块级元 ...
- Magisk+Xposed+Root switch+Pokémon GO
If you follow Android Police, there's a good chance you've got a rooted device, whether it be an eas ...
- 关于cn.jedisoft.framework.annotations 的增删改查
今天在做一个crud的功能的时候,调用api老是调用不同.奇怪的是 在add的时候能添加进去,而删除和修改的时候不能成功. 最后反应过来,我在修改和删除的时候用的主键id是int类型的,接口类型是不能 ...
- 深入理解http协议的特点
HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1.支持客户/服务器模式:2.简单快速:3.灵活:4.无连接:5.无状态. 无连接 无连接的含义是限制每次连接只处理一个请求. ...
- Python初学者第四天 二进制运转换
4day 1.二进制运算 a.十进制转换二进制 342 转换成二进制 342 101010110 Python提供了一种简单的计算二进制的方法:bin() b.文字转换成二进制 ASCII码表 GB ...
- Spring-aop实现切面的四种方式(1)
Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程 ...
- MYSQL 升序排序但值为0的排最后
转载 http://blog.csdn.net/looksun/article/details/51445205 如一张表的数据如下: 需要根据gz列的值进行升序排序,但值为0的排在最后面,即最终结果 ...
- 第四周 day4 python学习笔记
关于装饰器的更多信息可以参考http://egon09.blog.51cto.com/9161406/1836763 1.装饰器Decorator 装饰器:本质上是函数,(装饰其他函数),就是为其他函 ...