React AJAX

React 组件的数据可以通过 componentDidMount 方法中的 Ajax 来获取,当从服务端获取数据库可以将数据存储在 state 中,再用 this.setState 方法重新渲染 UI。

当使用异步加载数据时,在组件卸载前使用 componentWillUnmount 来取消未完成的请求。

以下实例演示了获取 Github 用户最新 gist 共享描述:

实例

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>php中文网 React 实例</title>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react.js"></script>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react-dom.js"></script>
    <script src="http://static.php.cn/assets/react/browser.min.js"></script>
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  </head>
 <body>
    <div id="example"></div>
    <script type="text/babel">
      var UserGist = React.createClass({
        getInitialState: function() {
          return {
            username: '',
            lastGistUrl: ''
          };
        },

        componentDidMount: function() {
          this.serverRequest = $.get(this.props.source, function (result) {
            var lastGist = result[0];
            this.setState({
              username: lastGist.owner.login,
              lastGistUrl: lastGist.html_url
            });
          }.bind(this));
        },

        componentWillUnmount: function() {
          this.serverRequest.abort();
        },

        render: function() {
          return (
            <div>
              {this.state.username} 用户最新的 Gist 共享地址:
              <a href={this.state.lastGistUrl}>{this.state.lastGistUrl}</a>
            </div>
          );
        }
      });

      ReactDOM.render(
        <UserGist source="https://api.github.com/users/octocat/gists" />,
        document.getElementById('example')
      );
    </script>
  </body>
</html>
### 实现 AJAX 异步请求的最佳实践 #### 使用 `useEffect` 钩子替代生命周期方法 为了确保组件挂载时仅发起一次网络请求,在函数组件中推荐使用 `useEffect` 来代替类组件中的 `componentDidMount`[^4]。 ```javascript import React, { useState, useEffect } from 'react'; import axios from 'axios'; function GoodList() { const [list, setList] = useState([]); useEffect(() => { async function fetchData() { try { let result = await axios.get('http://localhost:4000/api/goodlist'); setList(result.data.goodlists); } catch (error) { console.error("There was an error fetching the data!", error); } } fetchData(); }, []); // 空数组表示只在首次渲染后运行 return ( <ul> {list.map(item => ( <li key={item.id}>{item.name}</li> ))} </ul> ); } ``` #### 利用 `AbortController` 取消未完成的请求 当组件卸载或不再需要响应时,可以通过创建并传递给 fetch 的 `AbortController` 对象来取消正在进行的请求,防止内存泄漏和不必要的计算资源浪费[^2]。 ```javascript import React, { useState, useEffect } from 'react'; function DataFetcher() { const [data, setData] = useState(null); useEffect(() => { const controller = new AbortController(); async function getData() { try { const response = await fetch('/api/data', { signal: controller.signal }); if (!response.ok) throw Error(response.statusText); const json = await response.json(); setData(json); } catch (err) { if (err.name === "AbortError") { console.log("Fetch aborted"); } else { console.error(err.message); } } } getData(); return () => { controller.abort(); // 清除定时器或其他订阅操作 }; }, []); return /* ... */; } ``` #### 设置全局拦截器处理统一逻辑 对于跨多个 API 调用共享的行为(如身份验证令牌附加),可以在应用级别设置 Axios 拦截器以简化代码结构[^3]。 ```javascript // 创建实例以便于配置默认参数和其他选项 const instance = axios.create({ baseURL: 'https://example.com/', }); instance.interceptors.request.use( config => { // 自定义请求头等预处理器行为 return config; }, error => Promise.reject(error), ); instance.interceptors.response.use( res => res, err => { // 统一错误提示或者其他业务逻辑 return Promise.reject(err); }, ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值