React个人学习笔记
元素渲染
通过 ReactDOM.render() 方法渲染页面, 可以使用 ES6 class 来定义一个组件:
如何解析HTMl里面的空格:
1. 使用空格的 unicod 编码 : \u0020
2. 使用 dangerouslySetInnerHTML, 不建议使用,容易受到XSS攻击
class Welcome extends React.Component {
render() {
var htmltest = "Hellow World"
{/* 注释 */}
return (
<h1>Hello, {this.props.name}</h1>
<p>Hellow\u0020World</p>
<div dangerouslySetInnerHTML={{__html: htmltest}}></div>
)
}
}
组件的嵌套
import LessonsLeft from './LessonsLeft/index'
class Welcome extends React.Component {
render() {
return (<div>
<LessonsLeft />
<h1>Hello, {this.props.name}</h1>
</div>)
}
}
组件的数据状态state
声明当前组件的变量,必须通过 this.setState() 改变变量值,或者通过 this.forceUpdate() 手动触发DOM更新
var testAPP = React.createClass({
getInitialState:function(){ // 使用 getInitialState 声明state变量
return {
testData: '声明变量'
}
},
handleClick: function() {
// 通过 this.setState() 改变变量的值,
this.setState({
testData: '更改了变量值'
})
// 通过 this.forceUpdate() 改变变量的值,
// this.state.testData = '更改了变量值'
// this.forceUpdate()
},
render: function() {
return (
<div>
<button onClick={this.handleClick}>点击更改变量</button>
{this.state.testData}
</div>
)
}
})
React.render(
</testAPP>,
document.getElementById('app')
)
在使用类的写法中,state必须使用 constructor 初始化一下
class Footer extends ComponentExt<Props, State> {
constructor(props) {
super(props) // 调用基类的所有的初始化方法
this.state = {
visible: false,
batchTime: 3,
}
}
}
父子组件的传参props
父组件向子组件传递参数,子组件使用 props 接收
声明props参数的类型使用 propTypes ,类型分别有:array bool func number object string,node element 等等 isRequired 表示该值不能为空
声明props参数的默认值使用 getDefaultProps
var testAPP = React.createClass({
getInitialState:function(){ // 使用 getInitialState 声明state变量
return {
testData: '父组件的变量'
}
},
render: function() {
return (
<div>
<h1>这是父组件开始传参</h1>
<Template testData={this.state.testData} />
</div>
)
}
})
var template = React.createClass({
// 定义父组件传递参数的默认类型为String isRequired表示该值不能为空,
propTypes:{
messages: React.PropTypes.string.isRequired,
},
// 定义父组件传递参数的默认值
getDefaultProps: function () {
return {
testData: '这是默认的值'
}
},
render: function() {
return (
<div>
<h1>这是子组件props接收参数</h1>
<p>{this.props.testData}</p>
</div>
)
}
})
React.render(
</TestAPP>,
document.getElementById('app')
)
事件处理
React事件绑定属性的命名采用驼峰式写法,而不是小写
获得原始的事件对象,使用 e.nativeEvent
阻止事件默认行为,使用 e.preventDefault()
var ClickApp = React.createClass({
getInitialState:function(){
return {
clickCount: 0, }
},
handleClick: function(e){
this.setState({
clickCount: this.state.clickCount + 1,
});
// 获得完整的事件对象,而不是被封装过的
console.log(e.nativeEvent);
},
render: function(){
return (
<div>
<h2>点击下面按钮</h2>
<button onClick={this.handleClick}>点击我</button>
<p>你一共点击了:{this.state.clickCount}</p>
</div>
)
}
});
var clickComponent = React.render(
<ClickApp />,
document.getElementById('app')
)
DOM指向ref
将获得的refs对象转化为原生的DOM对象,使用 getDOMNode() 或者 React.findDOMNode()
ref 后面也可以接收一个函数 <div ref={ this.test() }><div>
获得子组件的方法也可以使用refs this.refs.name.test()
var FormApp = React.createClass({
handleSubmit:function() {
console.log(this.refs.goodInput.getDOMNode().value)
console.log(React.findDOMNode(this.refs['goodInput'].value))
},
render: function() {
return (
<input ref="goodInput" type="text" defaultValue={this.state.inputValue }/>
)
}
})
双向数据流
React本身并不存在双向数据绑定,我们可以通过 react-with-addons 插件声明 mixins 模拟实现
var EasyForm = React.createClass({
mixins: [ React.addons.LinkedStateMixin ], // 引入 React.addons.LinkedStateMixin 插件
getInitialState:function(){
return {
message: 'react is awesome!',
isReactAwesome: true,
}
},
// 引入插件后拥有 this.linkState() 方法,模拟实现双向数据绑定
render:function(){
return (
<div>
<input type="text" valueLink={this.linkState('message')} />
<input type="checkbox" checkedLink={this.linkState('isReactAwesome') } />
<br/>
</div>
)
}
});
this.linkState() 可以作为参数传递到子组件,通过子组件改变父组件的值
var EasyForm = React.createClass({
mixins: [ React.addons.LinkedStateMixin ],
getInitialState:function(){
return {
message: 'react is awesome!',
isReactAwesome: true,
}
},
render:function(){
return (
<div>
<SubComp messageLink={ this.linkState('message') } likeLink={this.linkState('isReactAwesome')} />
</div>
)
}
});
var SubComp = React.createClass({
render:function(){
return (
<div>
<h3>这是个子组件哦</h3>
<SubSubComp {...this.props } />
</div>
)
}
});
var SubSubComp = React.createClass({
render:function(){
return (
<div>
<p>你想说什么?</p>
<input type="text" valueLink={ this.props.messageLink } />
<p>你稀罕React么?</p>
<input type="checkbox" checkedLink = {this.props.likeLink } />
</div>
)
}
})
MIxins 方法共享
在不同的组件之间共用功能。共享代码,和页面一样具有生命周期
npm install react-mixin --save
const MixiLog = {
componentDidMount () {
console.log('Mixinlog componentDidMount')
},
log () {
console.log('这是Mixin的方法')
}
}
export default MixiLog
import ReactMixin from 'react-mixin' // 引入react-mixin
class AddLesson extends ComponentExt<Props, any> {
constructor(props) {
super(props)
this.state = {}
}
test () { // 调用mixin里面的方法
MixiLog.log()
}
render() {
const { lessonLineData } = this.props.classroomStore
return (
<div className={classes()}>
这是组件
</div>
)
}
}
ReactMixin(AddLesson.prototype, MixiLog) // 绑定mixin到该类的prototype
export default AddLesson
生命周期
shouldComponentUpdate:function(nextProp,nextState){
console.log('shouldComponentUpdate');
if(nextState.count > 10) return false;
return true;
},
手动卸载React 对象,使用 React.unmountComponentAtNode() 接收一个DOM节点参数
killMySelf: function(){
React.unmountComponentAtNode( document.getElementById('app') );
},
React个人学习笔记的更多相关文章
- React 入门学习笔记整理目录
React 入门学习笔记整理(一)--搭建环境 React 入门学习笔记整理(二)-- JSX简介与语法 React 入门学习笔记整理(三)-- 组件 React 入门学习笔记整理(四)-- 事件 R ...
- The Road to learn React书籍学习笔记(第二章)
The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...
- The Road to learn React书籍学习笔记(第三章)
The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...
- React Native 学习笔记--进阶(二)--动画
React Native 进阶(二)–动画 动画 流畅.有意义的动画对于移动应用用户体验来说是非常必要的.我们可以联合使用两个互补的系统:用于全局的布局动画LayoutAnimation,和用于创建更 ...
- React+Redux学习笔记:React+Redux简易开发步骤
前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...
- React Redux学习笔记
React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性 ...
- The Road to learn React书籍学习笔记(第一章)
react灵活的生态圈 Small Application Boilerplate: create-react-app Utility: JavaScript ES6 and beyond Styli ...
- 【React】学习笔记(一)——React入门、面向组件编程、函数柯里化
课程原视频:https://www.bilibili.com/video/BV1wy4y1D7JT?p=2&spm_id_from=pageDriver 目录 一.React 概述 1.1.R ...
- React Native学习笔记
React 是使用ES6 ,支持JSX语法, 开发组件化web或native的工具. 现阶段使用Babel工具转换成ES5 代码. 组件通过props属性传递不变化的内容,UI通过state属性变动来 ...
- React Native学习笔记之2
1:如何创建一个react native工程 首先进入到指定文件夹里面,然后在终端执行react-native init ReactNativeProject :其中ReactNativeProjec ...
随机推荐
- make :err Makefile.ssl is older than Makefile.org. Reconfigure the source tree (via './config' or 'perl Configure'), please.
内核编译时出现错误 Makefile.ssl is older than Makefile.org. Reconfigure the source tree (via './config' or 'p ...
- NOIP 2012 Day2
tags: 扩展欧几里得 二分答案 查分 倍增 二分答案 贪心 NOIP categories: 信息学竞赛 总结 同余方程 借教室 疫情控制 同余方程 Solution 首先同余式可以转化为等式. ...
- linux命令(11):df命令
1.查看磁盘空间和当前的磁盘数:df –lh或者df –i 2.显示指定类型磁盘:df -t ext4 3.列出各文件系统的i节点使用情况:df -ia 4.列出文件系统的类型:df -T
- MySQL-数据操作
阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 回到顶部 一 介绍 MySQL数据操作: DML ============= ...
- Zookeeper之Curator(1)客户端对节点的一些监控事件的api使用
<一>节点改变事件的监听 public class CauratorClientTest { //链接地址 private static String zkhost="172.1 ...
- .net 多播委托的使用方法以及场景,更简单的观察者模式
首先来说一下什么是多播委托 多播委托就是在委托里定义一个或者多个方法的一个集合 使用方法: public Action actList; //添加方法 public void AddActionMet ...
- pc、移动端H5网站 QQ在线客服、群链接代码【我和qq客服的那些事儿】
转载:http://blog.csdn.net/fungleo/article/details/51835368#comments 移动端H5 QQ在线客服链接代码 <a href=" ...
- 六十六 aiohttp
asyncio可以实现单线程并发IO操作.如果仅用在客户端,发挥的威力不大.如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多 ...
- 配置文件报错:元素类型 "XXX" 必须后跟属性规范 ">" 或 "/>"
这是一个比较常见的配置错误,一般分两步. 有的情况的确是xml文件出现了语法问题,可以让IDE来帮我们检查xml文件是否真的出现了语法错误.把xml内容复制进IDE中,让IDE帮我们检查错误. 如上图 ...
- Protocol Buffers 在前端项目中的使用
前言: 公司后端使用的是go语言,想尝试用pb和前端进行交互,于是便有了这一次尝试,共计花了一星期时间,网上能查到的文档几乎都看了一遍,但大多都是教在node环境下如何使用,普通的js环境下很多讲述的 ...