React-3.1 类式组件、todoList(类版本)实战

1. 内容回顾

  • 组件间的信息传递
  • 生命周期
  • 受控组件

2. 学习目标

  • 掌握React其他 API 使用:PureComponent、ref、children、dangerouslySetInnerHTML、key
  • 掌握函数式组件及常见 hooks 的使用
  • 可以独立开发基于Hooks 或 Component 的 todoList 应用

3. 学习内容

3.1 PureComponent

PureComponent 提供了一个具有浅比较的 shouldComponentUpdate 方法,其他和 Component 完全一致

浅比较:新修改的数据与原本的数据如果一样则不予更新,否则更新
1) 字符串正常
2) 对象的话,存的是地址,比较的也是地址,按照地址再去找具体的值,
所以没更换新地址的话,那么原本去赋值就不太行,
需要解构赋值,this.setState({list:[…list]})

Component 不管与原数据是否一样都重新全部更新

–App.js

import React, {
   PureComponent, Component } from 'react';

// Component  不管与原数据是否一样都重新全部更新

// PureComponent 提供了一个具有浅比较的 shouldComponentUpdate 方法,
// 其他和 Component 完全一致
// 浅比较:新修改的数据与原本的数据如果一样则不予更新,否则更新
//        1) 字符串正常
//        2) 对象的话,存的是地址,比较的也是地址,按照地址再去找具体的值,
//                  所以没更换新地址的话,那么原本去赋值就不太行,
//                  需要解构赋值,this.setState({list:[...list]})
class App extends PureComponent {
   

  state = {
   
    name:"尖叫",
    list:["运动饮料-01","运动饮料-02","运动饮料-03"]
  }

  render(){
   

    let {
   name,list} = this.state;
    return(
      <div>
        <h1>{
   name}</h1>
        <ul>
            {
   
              list.map((item,index)=>{
   
                return <li key={
   index}>{
   item}</li>
              })
            }
        </ul>

        <button onClick={
   ()=>{
   
          this.setState({
   name:"红牛"})
        }}>升级</button>

        <button onClick={
   ()=>{
   
          list.push("新口味");
          // 使用PureComponent时,注意使用解构赋值的方式!!!
          this.setState({
   list:[...list]})
          //this.setState({list}) //PureComponent下使用这个的话,扩大功能实现不了
        }}>扩大</button>
      </div>
    )
  }
}

export default App;

–index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  // <React.StrictMode>
    <App />,
  // </React.StrictMode>,
  document.getElementById('root')
);

如果使用Component,则不管与原数据是否一样都会重新全部更新;
以下是使用 PureComponent 的情况:修改的数据与原本的若一样则不予更新 在这里插入图片描述
升级 按钮:
在这里插入图片描述
扩大 按钮:
在这里插入图片描述

3.2 ref

  • 旧版 - string ref
  • 主流 - createRef()
  • 注意:在 组件挂载完成之后及更新之后使用
  • 本次结合一个滚动小插件来使用ref:
    • new BScroll():()内填入要滚动的对象,比较适用于移动端,可以拖拽,不能滚轮滑动
  1. 旧版用法示例:
import React, {
   PureComponent, createRef } from 'react';
import BScroll from "better-scroll"

// 滚动小插件:
// new BScroll(),()内填入要滚动的对象
// 注意:只能在 组件挂载完成之后及更新之后使用!!!!!!


// 新的小写法 ~ ~ ~
let list = [...(".".repeat(100))];
console.log(list)

class App extends PureComponent {
   
  
    // 新版的一个小弊端:需要新的话需要再重新创建一个,再绑到一个新的
    // box = createRef();// 2.新版ref写法(主流方式)-----  需要先在类里创建一个空的,存在box当中
    // list = createRef();

    componentDidMount(){
   
        console.log(this); //新版的写法时,不在refs里了,多了一个box,box: {current: div}
        console.log(this.refs); //ref的集合,旧版含有集合,新版写法里没有 

        console.log(this.refs.box);
        // console.log(this.box.current);

        new BScroll(this.refs.box);//1.旧版 ***
        // new BScroll(this.box.current);//2.新版-----
    }

    render(){
   

      return(
        <div  style={
   {
   
                height:"300px",
                border:"1px solid #000",
                overflow:"hidden"
              }}
        
              ref="box"       // 1.旧版***  绑定  其他地方例如:挂载完成之后及更新之后的生命周期函数 可以获取到
              // ref = {this.box}   // 2.新版----- 绑到box上,box属性中存了一个ref
        >

            <ul style={
   {
   
                  margin:0,
                  padding:0,
                  listStyle:"none"
                }}

                ref="list"
                // ref = {this.list}  //输出this时,则会多出一个list属性   list: {current: ul}
            >
                  {
   
                    list.map((item,index)=>{
   
                      return <li key={
   index}>这是第{
   index+1}个li</li>
                    })
                  }

            </ul>

          
        </div>
      )
    }
    
}

export default App;

在这里插入图片描述

  1. 新版、主流版本用法示例:
import React, {
   PureComponent, createRef } from 'react'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值