1.JSX渲染

想让类似 falsetruenull 或 undefined 出现在输出中,你必须先把它转换成字符串 :

<div>
My JavaScript variable is {String(myVariable)}.
</div>

2.获取上传文件的信息

class FileInput extends React.Component {
constructor(props) {
super(props);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleSubmit(event) {
event.preventDefault();
alert(
`Selected file - ${this.fileInput.files[0].name}`
);
} render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Upload file:
<input
type="file"
ref={input => {
this.fileInput = input;
}} /> </label>
<br />
<button type="submit">Submit</button>
</form>
);
}
} ReactDOM.render(
<FileInput />,
document.getElementById('root')
);

3.防止突变,添加数组的方法

  1.用concat重写成

handleClick() {
this.setState(prevState => ({
words: prevState.words.concat(['marklar'])
}));
}

  2.用ES6支持数组的spread语法

handleClick() {
this.setState(prevState => ({
words: [...prevState.words, 'marklar'],
}));
};

  

function updateColorMap(colormap) {
return {...colormap, right: 'blue'};
}

  3.不污染原始对象,使用Object.assign方法

function updateColorMap(colormap) {
return Object.assign({}, colormap, {right: 'blue'});
}

updateColorMap现在会返回一个新对象,而不会改变之前的旧对象。Object.assign在ES6中,需要polyfill支持。

如果使用Create React App,默认情况下 Object.assignspread对象都可以使用。

 4.Context

Context 设计目的是为共享那些被认为对于一个组件树而言是“全局”的数据,例如当前认证的用户、主题或首选语言。

  1.React.createContext

const {Provider, Consumer} = React.createContext(defaultValue);

创建一对 { Provider, Consumer }。当 React 渲染 context 组件 Consumer 时,它将从组件树的上层中最接近的匹配的 Provider 读取当前的 context 值。

如果上层的组件树没有一个匹配的 Provider,而此时你需要渲染一个 Consumer 组件,那么你可以用到 defaultValue 。这有助于在不封装它们的情况下对组件进行测试。

  2.Provider

<Provider value={/* some value */}>

React 组件允许 Consumers 订阅 context 的改变。

接收一个 value 属性传递给 Provider 的后代 Consumers。一个 Provider 可以联系到多个 Consumers。Providers 可以被嵌套以覆盖组件树内更深层次的值。

  3.Consumer

<Consumer>
{value => /* render something based on the context value */}
</Consumer>

一个可以订阅 context 变化的 React 组件。

接收一个 函数作为子节点. 函数接收当前 context 的值并返回一个 React 节点。传递给函数的 value 将等于组件树中上层 context 的最近的 Provider 的 value 属性。如果 context 没有 Provider ,那么 value 参数将等于被传递给 createContext() 的 defaultValue 。

  注意

每当Provider的值发送改变时, 作为Provider后代的所有Consumers都会重新渲染。 从Provider到其后代的Consumers传播不受shouldComponentUpdate方法的约束,因此即使祖先组件退出更新时,后代Consumer也会被更新。

  举个例子:

index.js

import React, { Component } from 'react';
import {ThemeContext,themes,UserContext} from './theme-context';
import ThemeTogglerButton from './theme-toggler-button' function Toolbar(props){
return(
<ThemeContext.Consumer>
{({theme,toggleTheme})=>(
<UserContext.Consumer>
{user=>(
<ThemeTogglerButton user={user} theme={theme} toggleTheme={toggleTheme}/>
)}
</UserContext.Consumer>
)}
</ThemeContext.Consumer>
);
} class LotsContext extends Component {
constructor(props){
super(props); this.toggleTheme = ()=>{
this.setState(state=>({
theme:
state.theme === themes.purple
?themes.pink
:themes.purple,
}));
};
this.state={
theme:themes.pink,
toggleTheme:this.toggleTheme,
user:'mosquito~'
};
}
render() {
const {user,theme,toggleTheme} = this.state;
return (
<ThemeContext.Provider value={{theme,toggleTheme}}>
<UserContext.Provider value={user}>
<Toolbar />
</UserContext.Provider>
</ThemeContext.Provider> );
}
} export default LotsContext;

theme-context.js

import React from 'react';
export const themes = {
pink:{
background:"pink",
},
purple:{
background:"purple",
},
}; export const ThemeContext = React.createContext({
theme:themes.pink,
toggleTheme:()=>{},
}); export const UserContext = React.createContext({
user:"mosquito~"
});

theme-toggler-button.js

import React from 'react';
import {ThemeContext} from './theme-context'; function ThemeTogglerButton(props){
return(
<ThemeContext.Consumer>
{({theme,toggleTheme}) => (
<div
onClick={toggleTheme}
style={{width:'100px',height:'100px',backgroundColor: theme.background}}
>
{props.user}
</div> )}
</ThemeContext.Consumer>
);
} export default ThemeTogglerButton;

运行结果:

 

React曾经忽略的知识点(下)的更多相关文章

  1. React曾经忽略的知识点(上)

    1.JSX 防注入攻击 你可以放心地在 JSX 当中使用用户输入 const title = response.potentiallyMaliciousInput; // 直接使用是安全的: cons ...

  2. MapReduce会自动忽略文件夹下的.开头的文件

    MapReduce会自动忽略文件夹下的.开头的文件,跳过这些文件的处理.

  3. Sqlserver中一直在用又经常被忽略的知识点一

    已经有快2个月没有更新博客了,实在是因为最近发生了太多的事情,辞了工作,在湘雅医院待了一个多月,然后又新换了工作...... 在平时的工作中,Sqlserver中许多知识点是经常用到的,但是有时候我们 ...

  4. React及Nextjs相关知识点小结

    React及Nextjs知识点小结 函数式组件和类组件区别是什么 1.函数式组件是用于创建无状态的组件,组件不会被实例化,无法访问this中的对象,无法访问生命周期方法,是无副作用的,相比于类组件函数 ...

  5. React Native初试:Windows下Andriod环境搭建

    最近想写个App,又觉得Native App 太无趣了Web App又没那么成熟然后发现了Facebook在9月发布的React Native比较新奇,所以决定捣鼓看看: React Native为F ...

  6. 【知了堂学习笔记】java 底层容易忽略的知识点

    1. java中的关键字 提到关键字,最主要的就是不能用关键字作为标识符,值得注意的有以下几点. ①其中goto与const在java中没有定义,但是也是关键字.这个基本用不到,但是应该有个认知. ② ...

  7. Javascript基础 - js中曾经忽略的知识点

    深入那些曾经忽略的Javascript知识 1. parseInt(string, [radix]),parseFloat(string) 一般我们省略第二个参数,parseInt(‘100’) == ...

  8. php核心技术与最佳实践知识点(下)

    九.缓存 1.缓存三大要素:命中率, 缓存更新策略,缓存最大数据量 2.命中率(mysql为例):mysql提供了一系列的query cache的global status来提现数据库缓存的情况: s ...

  9. 【React Native】React Native项目设计与知识点分享

    闲暇之余,写了一个React Native的demo,可以作为大家的入门学习参考. GitHub:https://github.com/xujianfu/ElmApp.git GitHub:https ...

随机推荐

  1. Python 入门之 内置模块 -- hashlib模块

    Python 入门之 内置模块 -- hashlib模块 1.hashlib 摘要算法,加密算法 (1)主要用途: <1> 加密 : md5 sha1 sha256 sha512 md5, ...

  2. py3 base64加密

    import base64 #字符串编码: encodestr = base64.b64encode('abcr34r344r'.encode('utf-8')) print(str(encodest ...

  3. jupyter notebook 使用多个python环境

    conda install nb_conda_kernels 执行上面的命令,然后启动notebook就可以选择conda中的所有环境了

  4. java.lang.StackOverflowError解决

    在使用JPA的仓储repository进行查询时,经常用到findAllbyId的方法: repository.findAllbyId() 但如果像下面的代码,当list的size量太大的话,就会报栈 ...

  5. 《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!

    1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到 ...

  6. redis 模拟redis server接收信息

    一.实现说明 客户端使用jedis正常set值到redis服务器   2. 模拟服务器接收jedis发送的信息 二.jedis客户端代码 package com.ahd.redis; import r ...

  7. 在easyui中解决使west和center为1:1,并且拖动窗口时能够自适应变化

    <script type="text/javascript"> // 解决页面两个grid的布局问题 $(function(){// 在页面加载完毕后 //consol ...

  8. Vue进行路由跳转的几种方式

    1.<router-link to="需要跳转到页面的路径"> 2.this.$router.push()跳转到指定的url,并在history中添加记录,点击回退返回 ...

  9. 剑指offer-6:数值整数次方

    一.题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 二.解题思想 分类讨论,充分考虑每种可能. exponent :0,1,& ...

  10. ArrayList实现原理分析

    ArrayList使用的存储的数据结构 ArrayList的初始化 ArrayList是如何动态增长 ArrayList如何实现元素的移除 ArrayList小结 ArrayList是我们经常使用的一 ...