React入门(一) State详解

这篇博客介绍了React入门的基础知识,重点讲解了State的概念和如何改变State。作者通过创建React应用演示了State的初始化,并通过实例解释了使用setState方法更新State时的异步行为及其回调函数的用途,帮助初学者避开常见陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

React入门(一) State详解

我们都是程序员,废话不多说马上开始!

一、 Demo创建/下载

两种方法创建新的React APP

1. github下载

  • 下载git地址.
  • 解压-打开
  • npm install
  • npm start
  • 如果有询问
  • y(3000端口任务在运行是否愿意运行在别的端口上?)

2. 自己的命令行创建

  • 找到自己心仪的文件夹 (全英文)
  • 用命令行打开并抵达心仪文件夹
  • npx create-react-app my-app
  • cd my-app
  • npm start

注意
npx在第一行不是一个错字 - 它是一个包转发工具,附带npm 5.2+。
创建的时候已经默认运行过(npm install )可以直接start

然后把 src/app.js的文件内容先改一下

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <p>
            修改文件夹 <code>src/App.js</code> 保存时候之后自动加载.
          </p>
        </header>
      </div>
    );
  }
}

export default App;

Ctrl + C
Ctrl + V

二、State是什么?

在这里插入图片描述
英文翻译是状态。
其实也可以理解为状态,一段文字中的某个值改变了,也可以理解为状态改变了。
看一个简单的例子

把 src/app.js的文件内容先改一下

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  state={Text:'我是state'}
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            State输出:{this.state.Text}
          </p>
        </header>
      </div>
    );
  }
}

export default App;
  state={Text:'我是state'}

这里的state是给state设置初值,不然会报错。不相信的话自己可以试一下。(因为state是undefined,所以他里面取不到Text)

通过上面的例子可以知道state里面放的是XX的状态
key value对应的
this.state.xx就可以取到对应key的状态

三、State如何改变?

通常在JS里面,我们要改变某一个值可能就只需要 X = XX; 就可以。

这里的state是一个状态。状态改变了,页面会自动刷新为最新的页面用最新的状态显示。
下面我们做一个小实验。

把 src/app.js的文件内容先改一下

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  state={Text:'我是state'}
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            State输出:{this.state.Text}
          </p>
          <button onClick={()=>{
            this.state.Text = '我是通过this.state.Text改变的State';
            alert(this.state.Text);
          }}>
            按我改变state
          </button>
        </header>
      </div>
    );
  }
}

export default App;

(不要在意细节!!!我们是测试按钮的样式不重要!!!)
点击按钮之后,我们发现,state的值是改变了,但是页面上面显示的值不是我们想要的啊。

那我要怎么才可以刷新页面出现我想要的state的值呢?

官方提供的方法
setState(updater, [callback])

可以这么理解,针对上面的例子

this.setState({Text:'我是通过this.state.Text改变的State'}, function(){})

后面的function,可以有,也可以没有。不需要的话就可以不用写-----------稍后会说

所以只需要

this.setState({Text:'我是通过this.state.Text改变的State'})

把 src/app.js的文件内容先改一下

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  state={Text:'我是state'}
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            State输出:{this.state.Text}
          </p>
          <button onClick={()=>{
            this.setState({Text:'我是通过this.state.Text改变的State'})
            alert(this.state.Text);
          }}>
            按我改变state
          </button>
        </header>
      </div>
    );
  }
}

export default App;

保存-热加载
之后我们发现,状态是改变了,可是alert的值不是我们想要的,还是老的值(状态)的。

可能你不知道我在说什么

通过一个小例子我们仔细感受一下。官方的setState究竟在干什么。

把 src/app.js的文件内容先改一下

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  state={
    Text:'大家一起看log吧,我这次啥也不做',
    conut:0,
  }
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            State输出:{this.state.Text}
          </p>
          <button onClick={()=>{
            console.log(this.state.conut);
            this.setState({conut: this.state.conut + 1});
            console.log(this.state.conut);
          }}>
            按我改变state
          </button>
        </header>
      </div>
    );
  }
}

export default App;

打开我们的react页面
按Ctrl + Shift + I
看log
然后按钮

在这里插入图片描述

诶,我不是setState了吗,为什么值没有改变还是初值呢?

我们换一个方法试一下

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  state={
    Text:'大家一起看log吧,我这次啥也不做',
    conut:0,
  }
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            State输出:{this.state.Text}
          </p>
          <button onClick={()=>{
            console.log(this.state.conut);
            this.setState({conut: this.state.conut + 1})
            setTimeout(()=>{
              console.log(this.state.conut);
            },1000);
          }}>
            按我改变state
          </button>
        </header>
      </div>
    );
  }
}

export default App;

那我们是不是可以认为setState不是一个立刻生效的函数。
有点类似异步的网络请求。

这是一个坑,很多新手都会遇到的坑。我曾经也遇到所以写出来。

那既然是类似异步的网络请求肯定也有callback咯?
是的!
我们把console.log放到刚刚我们没有写function里面。

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  state={
    Text:'大家一起看log吧,我这次啥也不做',
    conut:0,
  }
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            State输出:{this.state.Text}
          </p>
          <button onClick={()=>{
            console.log(this.state.conut);
            this.setState({conut: this.state.conut + 1}, ()=>{
              console.log(this.state.conut);
            })
            
          }}>
            按我改变state
          </button>
        </header>
      </div>
    );
  }
}

export default App;

这样的好处我们不需要手动的控制等待时间的大小,因为根据设备的不同这个时间可能会太多或者太少。

本人React小菜,有说的不对的地方还请大神指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值