## 简介
* React 把组件看成是一个状态机(State Machines)。
* 通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。
* React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。
* 下面我们来看个简单的例子了解下state状态。
## 拓展ButtonX组件
1. 加入state机制,完整代码如下
~~~
import React, { PureComponent } from 'react';
import { Button } from 'antd';
import { detail } from '../../services/demo';
import DescriptionList from '../DescriptionList';
const { Description } = DescriptionList;
export default class ButtonX extends PureComponent {
state = {
data: "暂无",
};
handleSubmit = print => {
const promise = this.init(print);
console.log(promise);
};
init = async print => {
const resp = await detail({ name: print });
if (resp.success) {
console.log(resp.data);
this.setState({ data: resp.data });
} else {
console.log(resp.msg);
}
};
render() {
const { children, print } = this.props;
const { data } = this.state;
return (
<div>
<Button
type="primary"
onClick={() => {
this.handleSubmit(print);
}}
>
{children}
</Button>
<Description>返回数据为:{data}</Description>
</div>
);
}
}
~~~
2. 需要注意的有三点:
(1) . 在代码最上方定义了state,里面有一个字段 `data`
~~~
state = {
data: {},
};
~~~
(2) . 在接口返回中使用了setState来更新state对应的值
`this.setState({ data: resp.data });`
(3) . 在生成的Button旁边加了从state中获取的代码并显示
`const { data } = this.state;`
`<span>返回数据为:{data}</span>`
3. 将UI与state绑定之后,后续若有数据变更,只需在接口返回处使用`this.setState({ data: resp.data });`刷新state的值,react就会自动重新渲染整个UI,无需再关系UI的生成逻辑。
## 查看效果
1. 我们进入系统,发现目前按钮旁边的提示为暂无
![](https://box.kancloud.cn/69879ac7b0c1f976695d7a20361b1c55_992x728.png)
2. 点击按钮,等待接口加载完毕,发现提示信息已经变化
![](https://box.kancloud.cn/abe3d66684b7ec4fa3833d7a476697bf_1228x1202.png)
3. 我们没有操作UI,只是变更了state的值,React就会自动帮我们重新渲染UI。
4. 这样一来,数据与UI可以完全解耦,可以令我们后续的开发非常高效。
## 结尾语
* 到这里,关于Sword的最基础的技术点我们就学完了
* 下一章节我们将直接开始编写一个简单业务模块的增删改查