React学习记录
托webpack的福,我终于可以开始写React了。==ORZ
我感觉我接近webpack工程师更进一步了哈哈哈。
以下所有内容均来自小红书,仅是我的个人记录,如想系统学习,请移步:React小书 : http://huziketang.com/books/react/lesson1
超级推荐+收藏文档:React小书 : http://huziketang.com/books/react/lesson1
参考文档:
1.React官网
2.react组件生命周期
特别注意(不定时更新,越往上越新):
- 今天学到了小书的第三阶段中的context,应该算是前面学的变量不断提升到store的使用的过渡吧,之前入门过vuex,想必这里不会很难?关于这个context也是非常有趣,React团队觉得它危险,所以将它的使用设定的比较麻烦,如果不按照其章程写,它就不给你显示,哈哈,也是很符合人性化啊。以下只放部分代码,Title是在Header组件中的,内容都是小书的,比较简单:http://huziketang.com/books/react/lesson29
下方这个是不显示的。
class Index extends Component {
static childContextTypes = {
themeColor: PropTypes.string
}
constructor() {
super();
this.state = {
themeColor: 'red'
}
}
getChildContext() {
return {
themeColor: this.state.themeColor
}
}
render() {
return (<div>
<Header />
<Main />
</div>)
}
}
class Title extends Component {
render() {
return (<div><h1 style={{color:this.context.themeColor}}>React.js 小标题</h1></div>)
}
}
子组件想要获取context的内容,就必须写contextTypes(以下是写在Title中的示例) ,写完之后就能看见红色的效果了~
static contextTypes = {
themeColor: PropTypes.string
}
今天写小书的评论组件的时候,又忘了一件事情,还是清楚定时器的问题,这次完成的是一个删除的功能,因为之前还完成了一个关于显示评论在几秒之前出现的功能,用到了计时器,所以这次在删除之后,忘了关闭计时器,而由于这个时候被删除的组件还在不断的setState,由于setState只能在挂载的组件中使用,所以它会一直报错。
此句来自小红书:
这是因为,当时钟隐藏的时候,我们并没有清除定时器。时钟隐藏的时候,定时器的回调函数还在不停地尝试 setState,由于 setState 只能在已经挂载或者正在挂载的组件上调用,所以 React.js 开始疯狂报错。
多次的隐藏和显示会让 React.js 重新构造和销毁 Clock 组件,每次构造都会重新构建一个定时器。而销毁组件的时候没有清除定时器,所以你看到报错会越来越多。而且因为 JavaScript 的闭包特性,这样会导致严重的内存泄漏
这时候componentWillUnmount 就可以派上用场了,它的作用就是在组件销毁的时候,做这种清场的工作。例如清除该组件的定时器和其他的数据清理工作。我们给 Clock 添加 componentWillUnmount,在组件销毁的时候清除该组件的定时器:
React里面的setState是异步的。React里面的setState是异步的。React里面的setState是异步的。
两个ReatDOM.render要是递交到同一个节点上,最后只会显示一个,递交到不同节点则可以共存。 如果冲突则只显示后面的那一个。 就像是innerHTML的替换一样
VirtualDOM的组件首字母一定要大写。 如果不大写,最后编译虽然没有错,但是什么都不会显示。
没有经过特殊处理的话,这些on*的事件监听只能用在普通的HTML文件上,而不能用在组件标签上。(今天快要看完小书第二阶段顺便复习了一遍小书第一阶段发现自己不知不觉又忘掉了这句话)
如果没有没有绑定东西,我们在onClick所调用的那个函数的函数体里面的this,将会是null或者undefined,我们要自行绑定才会有this.因为他这是作为一个函数使用,而不是作为对象传值。
<h1 onClick={this.FunctionClick.bind(this)} > React </h1>
这样的函数最后将会是先执行两次console,最后才执行this.setState,这就跟我们之前说的callback到promise中的异步和同步异曲同工了。 在这里this.setState被放进缓存之中,等待队列执行。而解决的办法,依旧也和callback,promise有着相近的思想。
handleClickOnLikeButton () {
console.log(this.state.isLiked)
this.setState({
isLiked: !this.state.isLiked
})
console.log(this.state.isLiked)
}
除此之外,这是一个获取用户输入的input.
handleInputChange(event) {
this.setState({
content: event.target.value
}, () => {
if (!!this.props.share) {
const {
content
} = this.state;
this.props.share({
content
});
} else {
console.log("error");
}
});
}
如果以上不采用回调的形式书写,而是将(if!!this.props.share)
里面的东西和this.setState分开写,最后就会造成少了一个输入的现象。
下面是我今天的react笔记。
import React from 'react';
import ReactDOM from 'react-dom';
const title='test_for_jsx';
const pretitle='aaa';
const element=(<div><h1>Hello,{title} and {pretitle}</h1></div>);
ReactDOM.render(element,document.getElementById('root'));
首先是上面这个,若是把pretitle放在element定义的下方,不会报错,react估计会认为它是个空字符或者null.(待查)
React所有的jsx值进行编码,所以可以防止XSS攻击。
看官方的英文文档实在是吃力加犯困啊,还好运气好,找到了React小红书。
这是今天的习题 https://scriptoj.com/problems/7
另外吐槽下刚注册的那个题也好好玩,这个网站和作者超赞!
小红书里面有习题,天知道当我看到那个Accept的感动哈哈哈,刚打完羽毛球,神清气爽解题就是快。
class Computer extends Component{
constructor(){
super();
this.state={
status:'off'
}
}
Change(){
this.setState({
status: this.state.status==='off'?'on':'off'
})
}
render(){
return (<div>
<button onClick={this.Change.bind(this)}>开关</button>
<Screen showContent={this.state.status==='off'?'显示器关了':'显示器亮了'} />
</div>)
}
}
class Screen extends Component{
static defaultProps={
showContent:"无内容"
}
render(){
return (
<div className="screen">
{this.props.showContent}
</div>
)
}
}
- 依旧是小红书的习题,关于组件互相传值,根据输入的数字求出保留两位小数的百分比:https://scriptoj.com/problems/9
import React, {
Component
} from 'react';
import ReactDOM from 'react-dom';
class Input extends Component {
constructor() {
super();
this.state = {
content: ''
}
}
handleInputChange(event) {
this.setState({
content: event.target.value
}, () => {
if (!!this.props.share) {
const {
content
} = this.state;
this.props.share({
content
});
} else {
console.log("error");
}
});
}
render() {
return (
<div>
<input type='number' value={this.state.content} onChange={this.handleInputChange.bind(this)} />
</div>
)
}
}
class PercentageShower extends Component {
static defaultProps = {
number_value: ''
}
render() {
return (
<div>{this.props.number_value}%</div>
)
}
}
class PercentageApp extends Component {
constructor() {
super();
this.state = {
content: ''
}
}
handleShare(number) {
number.content = (number.content * 100).toFixed(2);
this.setState({
content: number.content
})
}
render() {
return (
<div>
<Input share={this.handleShare.bind(this)}/>
<PercentageShower number_value={this.state.content} />
</div>
)
}
}
ReactDOM.render(<PercentageApp />, document.getElementById('root'));
React学习记录的更多相关文章
- 业余学习react 学习记录
http://www.ruanyifeng.com/blog/2015/03/react (阮一峰 react 学习) 1.搭建环境:npm 使用 React npm install -g cnpm ...
- React学习记录一
半路出家直接上手React,其实有点吃力,所以开始研究create-react-app,从这里下手吧. create-react-app 官方网站:https://github.com/faceboo ...
- react学习记录(一)
一.React是什么 声明式写法(强调结果,命令式编程强调过程) 组件化 一次学习,随处编写(多种应用场景,web程序,原生手机应用,系统应用,命令行工具) 二.为什么学习react 大公司加持-fa ...
- react学习记录(三)——状态、属性、生命周期
react的状态state React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM) class Clock extends React.Compon ...
- react学习记录(二)
JSX 在render中return标签的部分可以插入字符串,数字,数组 class Welcome extends React.Component { render(){ return ( < ...
- react 学习记录
1. 脚手架搭建项目 create-react-app https://www.jianshu.com/p/d196761c8332 2. UI框架 https://ant.design/docs ...
- React学习记录二
环境基本弄清楚了以后,开始总会写个hello world什么的,开发做了这么久了,就跳过这一步吧. 还是从打开vscode说起吧,这里文件菜单打开一个文件夹Demos,查看菜单打开集成终端,也可以使用 ...
- react 学习与使用记录
相关技术:webpack+react+react-router+redux+immutable 郭永峰react学习指南 1.git bash--windows命令行工具 --教程 下载地址 2. i ...
- ES6学习记录
前言 由于要学习React Native ,所以得用到ES6,故为运用React Native做一个铺垫 学习记录 一.变量 1.let let 与 var 作用相同,用于定义变量,但是作用域不同.不 ...
随机推荐
- Gym - 100513B:Colored Blankets (构造)(存疑)
题意:给定N的棒棒,K种颜色,每个棒棒的两端可以涂色.现在已知所有的线段要么有一端涂色,要么两端都没有涂色,现在要求把所有的没涂色的部分涂色,使得我们可以把涂色后的棒棒分为N/K组,每组的涂色情况相同 ...
- NYOJ-括号配对问题--------待解决,RE
描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的 ...
- poj3585 Accumulation Degree[树形DP换根]
思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移 ...
- bzoj 4199: [Noi2015]品酒大会 后缀树
题目大意: 给定一个长为n的字符串,每个下标有一个权\(w_i\),定义下标\(i,j\)是r相似的仅当\(r \leq LCP(suf(i),suf(j))\)且这个相似的权为\(w_i,w_j\) ...
- BZOJ3401:[USACO2009MAR]Look Up
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ3545:[ONTAK2010]Peaks
浅谈线段树合并:https://www.cnblogs.com/AKMer/p/10251001.html 题目传送门:https://lydsy.com/JudgeOnline/problem.ph ...
- Linux负载均衡软件之LVS
一. LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是linuxvirtualserver.org ...
- Scala总结
Scala总结 ===概述 scala是一门以Java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言. scala是纯粹的面向对象的语言.java虽然是面 ...
- art-template-loader:template
ylbtech-art-template-loader: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:ht ...
- JZ2440 启动NFS网络文件系统_初试led驱动
http://blog.csdn.net/emdfans/article/details/12260969 u-boot ---> q 修改bootargs变量 默认: bootargs=noi ...