2016-09-26 4 views
6

Hey Leute Ich habe ein Problem mit Abruffunktionen in meiner ersten Reaktion js App definiert.Fetch-Methode ist nicht mit ES6 fetch in React

Das ist die Struktur meines Projekts:

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

Dies ist, was ich mit NPM installiert haben:

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 

Ich benutze 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" 
    } 
} 

Dies ist die Datei, wo ich die UI bauen:

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') 
); 

Wenn ich versuche es über den Browser, um es auszuführen (Methode holen nicht definiert ist) versagt Ich habe auch checked this related post ES6 `fetch is undefined` und ich habe den Import ohne Erfolg aufgenommen. Ich habe auch es6-promise importiert, aber es scheitert auch.

Was mache ich falsch? Ist es ein Konfigurationsproblem oder was? Wenn ich "npm run build" starte, gibt es keinen Fehler und die build.js scheint in Ordnung zu sein.

+1

, warum Sie nicht mit 'Import Import holen holen von 'isomorph-Fetch';' statt 'Import 'isomorph-Fetch';'? –

+0

Als Nebenbemerkung scheinen Sie die geschweiften Klammern für das Objektliteral zu verpassen, das Sie als zweites Argument für den Aufruf 'fetch()' übergeben. Es sollte 'fetch ('xxx/people', {methode: 'get', headers: {'token': 'xxx'}});' – saadq

+0

Nicht sicher sein, dass Sie alle node_module in der Zeile ausschließen möchten; ausschließen:/(node_modules | bower_components) /, –

Antwort

17

Es ist eine exportierte Standard, also ...

import fetch from 'isomorphic-fetch' 
2

Hinzufügen eines polyfill hierfür der richtige Ansatz ist. Wenn Sie eines meiner neuesten Projekte betrachten, müssen Sie nur die folgenden Importe durchführen:

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

promise.polyfill(); 

Es sieht aus wie Sie nicht ganz die richtige es6-Versprechen Import haben, die die .polyfill() -Methode erfordert aufgerufen werden. Ich würde empfehlen, diese in den Einstiegspunkt der Anwendung zu legen, da Sie sie nur einmal importieren müssen.

Ich würde auch empfehlen, die Babel Polyfill enthalten;

import 'babel-polyfill'; 
+0

Können Sie mir erklären, was ein Polyfill ist? – mannuk

+0

Ein Polyfill oder Polyfiller ist ein Stück Code (oder Plugin), das die Technologie bereitstellt, die Sie als Entwickler erwarten, dass der Browser nativ bereitstellt. Dies ist gut abgedeckt von remysharp https://remysharp.com/2010/10/08/what-is-a-polyfill –

+1

danke. Also, wenn ich ES6-Versprechen importiere, muss ich vor der Klasse Person ... promise.polyfill aufrufen? Die Lösung, die @D. Walsh hat dafür gesorgt, dass es funktioniert, und es ist nur erforderlich, fetch von 'isomorphic-fetch' zu importieren. Ich erwähne das, weil ich die .polyfill() in einigen Tutorials gesehen habe, aber idk warum sie es benutzt haben. – mannuk