fetch 方法未在 React 中使用 ES6 fetch 定义

Posted

技术标签:

【中文标题】fetch 方法未在 React 中使用 ES6 fetch 定义【英文标题】:fetch method is not defined using ES6 fetch in React 【发布时间】:2017-02-04 02:22:53 【问题描述】:

我的第一个 react js 应用程序中的 fetch 函数有问题。

这是我项目的结构:

hello-world
  -- app
     -- components
       -- main.jsx
  -- node_modules
  -- public
     -- build.js
     -- index.html
  -- package.json

这是我使用 npm 安装的:

npm install react react-dom babel-core babel-loader babel-preset-es2015    babel-preset-react webpack --save-dev
npm install --save isomorphic-fetch es6-promise

我使用 webpack webpack.config

module.exports = 
  entry: './app/components/main.jsx',
  output: 
    path: './public/',
    filename: "build.js",
  ,
  module: 
    loaders: [
      
        exclude: /(node_modules|bower_components)/,
        loader: 'babel',
        query: 
          presets: ['es2015', 'react']
        
      
    ]
  
;

package.json


  "name": "hello-world",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": 
    "build": "webpack -w"
  ,
  "author": "mannuk",
  "license": "MIT",
  "devDependencies": 
    "babel-core": "^6.14.0",
    "babel-loader": "^6.2.5",
    "babel-preset-es2015": "^6.14.0",
    "babel-preset-react": "^6.11.1",
    "react": "^0.14.8",
    "react-dom": "^0.14.8",
    "webpack": "^1.13.2"
  ,
  "dependencies": 
    "es6-promise": "^3.3.1",
    "isomorphic-fetch": "^2.2.1"
  

这是我构建 UI 的文件:

main.jsx

import React from 'react';
import ReactDOM from 'react-dom';
import 'isomorphic-fetch';
import 'es6-promise';

class Person extends React.Component 

  constructor(props)
    super(props);
    this.state = people : [];
  

  componentWillMount()
    fetch('xxx/people',
      method: 'get',
      headers: 'token' : 'xxx'
      )
      .then((response) => 
        return response.json()
      )
      .then((people) => 
        this.setState( people: people )
      )
  

  render()
    return <div>
        <input type="text" value=this.state.people[0].name></input>
      </div>
  


ReactDOM.render(
  <Person/>,
  document.getElementById('container')
);

如果我尝试通过浏览器运行它会失败(未定义获取方法)我还检查了此相关帖子 ES6 `fetch is undefined` 并且我已包含导入但没有成功。我还包括了 es6-promise 导入,但它也失败了。

我做错了什么?是配置问题还是什么?当我运行“npm run build”时没有错误,build.js 似乎没问题。

【问题讨论】:

为什么不用import fetch from 'isomorphic-fetch'; 而不是import 'isomorphic-fetch'; 导入fetch? 作为旁注,您似乎缺少作为第二个参数传递给 fetch() 调用的对象文字的花括号。应该是fetch('xxx/people', method: 'get', headers: 'token' : 'xxx' ); 不确定是否要排除该行中的所有 node_modules ;排除:/(node_modules|bower_components)/, @saadq 你是对的。如果我缺少花括号,为什么我运行 npm run build 时不会失败... 【参考方案1】:

这是一个导出的默认值,所以...

import fetch from 'isomorphic-fetch'

【讨论】:

【参考方案2】:

为此添加 polyfill 是正确的方法。查看我的最新项目之一,您只需要执行以下导入;

import promise from 'es6-promise';
import 'isomorphic-fetch';

promise.polyfill();

看起来您还没有完全正确地导入需要调用 .polyfill() 方法的 es6-promise 导入。我建议将它们放在应用程序的入口点,因为您只需要导入它们一次。

我还建议您包含 babel polyfill;

import 'babel-polyfill';

【讨论】:

你能解释一下什么是 polyfill 吗? polyfill 或 polyfiller 是一段代码(或插件),它提供了开发人员期望浏览器原生提供的技术。 remysharp remysharp.com/2010/10/08/what-is-a-polyfill 很好地涵盖了这一点 谢谢。因此,如果我导入 es6-promise,我需要在 Person 类之前调用​​ promise.polyfill ...? @D 的解决方案。 Walsh 提供了它的工作原理,它只需要从“isomorphic-fetch”导入 fetch。我提到这一点是因为我在一些教程中看到了 .polyfill() 但不知道他们为什么使用它。

以上是关于fetch 方法未在 React 中使用 ES6 fetch 定义的主要内容,如果未能解决你的问题,请参考以下文章

@testing-library/与 msw/node 反应; window.fetch 未在 POST 上返回正文

使用 fetch 和 ES6 承诺处理自定义错误的最简洁方法

React JS 视图未在 setState() 上重新渲染

fetch 未在 D3 csv 调用中定义

ES6 fetch方法封装

正文未在“获取”POST请求和(我的)解决方案中发送[重复]