父组件:
子组件:
export class ChildCpn extends React.Component{
render(){
const {name , age , height} = this.props
return (
{"姓名" + name + "," + "年龄" + age + "身高" + height}
)
}
}
父组件:
addNum() {
this.setState({
num : this.state.num + 1
})
}
子组件:
import React from "react";
export class BtnCpn extends React.Component{
render(){
const { addNum } = this.props
return (
+1
)
}
}
但是我们也出现了this的绑定问题:
子传父通信.js:22
Uncaught TypeError: Cannot read properties of undefined (reading 'setState')
at addNum (子传父通信.js:22:1)
nind绑定
箭头函数:
addNumTwo = () => {
this.setState({
num : this.state.num + 1
})//箭头函数
}
由两部分组成:tabBar以及父组件
父组件传递数据给子组件,点击子组件,传递数据给父组件,切换内容
App.js
import React from "react";
import { TabBar } from "./tabBar";
export class App extends React.Component{
constructor(){
super();
this.state = {
tabList : ["流行" , "新款" , "精选"],
context : "流行",
curIndex: 0
}
}
render(){
return (
{this.state.context}
)
}
handleTabClick = (index) => {
this.setState({
curIndex: index,
context: this.state.tabList[index]
});//更改的函数
}
}
tabBar
import React from "react";
export class TabBar extends React.Component{
render(){
const {tabList , curIndex , clickItem } = this.props;
return (
{
tabList.map((item, index) => (
- clickItem(index)}
>{item}
))
}
)
}
}
context相关的api
React.createContext
用于创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 的组件时,它会从组件树中最近的 Provider 中读取当前的 context 值。
Context.Provider
每个 Context 对象都会有一个 Provider React 组件,它允许消费组件订阅 context 的变化。
Class.contextType
用于 class 组件中订阅 Context,只有当组件中使用了 contextType
,组件才会订阅 Context 的变化。
Context.Consumer
用于函数式组件中订阅 Context。它允许你订阅 context 的变化,并在 context 发生变化时重新渲染组件。
useContext
Hook用于函数式组件中订阅 Context。它接收一个 context 对象(从 React.createContext
创建)并返回该 context 的当前值。
实例:
import React, { createContext, useContext } from 'react';
// 创建一个 Context 对象
const ThemeContext = createContext('light');
// 一个函数式组件,使用 useContext 订阅 Context
function ThemedButton() {
const theme = useContext(ThemeContext);
return ;
}
// 一个中间组件
function Toolbar() {
return (
);
}
// 应用程序的顶层组件
function App() {
return (
);
}
export default App;
其实也算是传参数叭,只是参数是html表达式
App.js
aaa}
centerSlot={bbb}
rightSlot={ccc}
/>
NavBar2:
export class NavBar2 extends React.Component {
render() {
const {leftSlot , centerSlot , rightSlot } = this.props;
return (
{leftSlot}
{centerSlot}
{rightSlot}
)
}
}
setState方法是从Component中继承过来的。
当this.state里面有两个属性:name、title
我们修改只修改name,那么title会不会受到影响呢?答案是不会
源码中其实是有对 原对象 和 新对象进行合并的:
Object.assign
setState可以传入参数或者是函数:
传入参数:数据会进行合并,多个setSEtate合并更新为1个
传入函数:数据不会进行合并
最后会+3
更新优化的方法:
当节点为不同的元素,React会拆卸原有的树,并且建立起新的树:
当比对两个相同类型的 React 元素时,React 会保留 DOM 节点,仅比对及更新有改变的属性。
在默认条件下,当递归 DOM 节点的子元素时,React 会同时遍历两个子元素的列表;当产生差异时,生成一个
mutation。
优化:加入一个key属性
当子元素(这里的li)拥有 key 时,React 使用 key 来匹配原有树上的子元素以及最新树上的子元素:
在下面这种场景下,key为111和222的元素仅仅进行位移,不需要进行任何的修改;
将key为333的元素插入到最前面的位置即可;
key的注意事项:
import React from 'react';
import './App.css';
class App extends React.Component {
constructor(){
super()
this.state = {
counter:0,
message :"你好呀"
}
}
render(){
console.log("render正在被调用")
return (
当前计数为:{this.state.counter}
)
}
btnAdd(){
this.setState({
counter:this.state.counter+1
})
}
}
export default App;
每一次点击按钮都会重新调用render渲染,这是非常消耗性能的
我们可以使用shouldComponentUpdate提升性能
import React from 'react';
import './App.css';
class App extends React.Component {
constructor(){
super()
this.state = {
counter:0,
message :"你好呀"
}
}
shouldComponentUpdate(nextProps , nextState){
if(this.state.counter !== nextState.counter){
return true;
}
return false;
}
render(){
console.log("render正在被调用")
return (
当前计数为:{this.state.counter}
{this.state.message}
)
}
btnAdd(){
this.setState({
counter:this.state.counter+1
})
}
changeText(){
this.setState({
message:"蒋乙菥"
})
}
}
export default App;
import React from 'react';
import './App.css';
class Pure extends React.PureComponent {
constructor(){
super();
this.state = {
counter: 0,
message: "你好呀"
}
}
btnAdd = () => {
this.setState({
counter: this.state.counter + 1
})
}
changeText = () => {
this.setState({
message: "蒋乙菥"
})
}
render(){
console.log("render正在被调用")
return (
当前计数为:{this.state.counter}
{this.state.message}
)
}
}
export default Pure;
对函数组件做优化:在有改变的时候才进行渲染