@[TOC](React入门(一) State详解)
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的文件内容先改一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | 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的文件内容先改一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | 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是给state设置初值,不然会报错。不相信的话自己可以试一下。(因为state是undefined,所以他里面取不到Text)
通过上面的例子可以知道state里面放的是XX的状态
key value对应的
this.state.xx就可以取到对应key的状态的值
三、State如何改变?
通常在JS里面,我们要改变某一个值可能就只需要  X = XX; 就可以。
这里的state是一个状态。状态改变了,页面会自动刷新为最新的页面用最新的状态显示。
下面我们做一个小实验。
把 src/app.js的文件内容先改一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | 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])
可以这么理解,针对上面的例子
1
   | this.setState({Text:'我是通过this.state.Text改变的State'}, function(){})
  | 
 
后面的function,可以有,也可以没有。不需要的话就可以不用写———–稍后会说
所以只需要
1
   | this.setState({Text:'我是通过this.state.Text改变的State'})
  | 
 
把 src/app.js的文件内容先改一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | 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的文件内容先改一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | 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了吗,为什么值没有改变还是初值呢?
我们换一个方法试一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
   | 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里面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
   | 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小菜,有说的不对的地方还请大神指出。