【问题标题】:Manipulating JSON in React在 React 中操作 JSON
【发布时间】:2016-02-18 17:41:50
【问题描述】:

所以我试图让我在 React 中的 UI 依赖于我的 JSON 文件。我在这里看了很多文章,但我没有找到一些东西,我可以理解和使用。我认为loading json data from local file into React JS 是我最接近的,但我不确定如何将它应用到我的程序中。

预知识;我通过this setup使用ES6。

我试图通过 .map 将我的 React 基于本地 JSON 文件,然后每次渲染一个 div,有一个键。后来我也想把一些JSON值变成<p></p>,但我还没有那么远。

我尝试关注the tutorial,它通过 AJAX 调用访问 JSON 文件,但无法在上述设置中工作 - 是的,我发现我无法在 ES6 中使用 getInitialState。无论我尝试什么,它总是给我一个解析错误或找不到 myFile.json。

所以我需要的是这样的东西

var data = require('./myFile.json');

class theWholeThing extends React.Component {
 render() {
   <div className="container">
        return <makeDiv key={key} item={item}/>;
   </div>
    }
  }

class makeDiv extends React.Component {
    {data.levels.map(function (item, key) { //mapping through the key "levels" in json
       return <div className="itIsVisible"></div>;
    })}
}

所以每次“levels”中有一个level,lvl1,lvl2,lvl3,都应该有一个div。如果我在 json 中创建另一个级别,则 UI 中应该有另一个 div。

感谢任何建议或链接到其他文章。

我是 React、json 和 AJAX 调用的新手,一般来说,我是中级(或有点超过初学者)程序员的新手。

PS 我不是想制作游戏,更多的是一种通过简单但直观的 GUI 获取信息的交互方式。

【问题讨论】:

    标签: json ajax reactjs


    【解决方案1】:

    你需要为 webpack 使用 json 加载器:https://github.com/webpack/json-loader

    const json = require('json!./myFile.json');
    

    编辑:实际上你应该能够做到const json = require('./myFile.json');

    但这不是 AJAX 请求,它会将文件构建到您的应用中。

    要获取 json 脚本,您可以使用类似:https://github.com/github/fetch

    fetch('/myFile.json')
      .then(response => {
        return response.json()
      }).then(data => {
        this.setState({ levels: data.levels });
      }).catch(ex => {
        console.log('parsing failed', ex)
      })
    

    你也可以在构造函数中设置组件的初始状态:

    constructor(props) {
       super(props)
       this.state = { ... }
    }
    

    【讨论】:

    • 谢谢它以简单的方式帮助了我
    【解决方案2】:

    这里是 ajax 的获取 json 部分。 从 server.js 开始。

    'use strict';
    
    let bodyParser = require('body-parser');
    let express = require('express');
    let favicon = require('serve-favicon');
    
    let path = require('path');
    let port = Number(3500);
    
    let routes = require('./routes');
    
    let app = express();
    let server = app.listen(port);
    
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    
    app.use('/', express.static('ui-dist'));
    app.use('/routes', routes);
    
    app.use(favicon(path.join(__dirname, '..', 'ui-dist', 'img', 'favicon.ico')));
    app.get('/', function(req, res){ res.sendfile(__dirname + '/index.html', [], null); });
    路线。

    'use strict';
    
    let express = require('express');
    let router = express.Router();
    
    let getSetData = require('./routes/getsetdata');
    
    router.get('/getData', function(req, res) {
      let getDataDone = function(data){ res.send(data); };
      getSetData.getData(getDataDone);
    });
    
    router.post('/setData', function(req, res) {
      let setDataDone = function(data){ res.send(data); };
      console.log(req.body);
      getSetData.setData(req.body, setDataDone);
    });
    
    module.exports = router;

    getSetData。

    'use strict';
    
    var fs = require('fs');
    
    var rootDataPath = './data';
    
    var getData = function(doneCallBack) {
      var filePath = rootDataPath + '/basic.json';
      var jsonReadCallBack = function(err, data){
        if (err) doneCallBack('Data readFile error ' + filePath);
        else {
          var jsonData = JSON.parse(data.toString());
          doneCallBack(jsonData);
        }
      };
      fs.readFile(filePath, jsonReadCallBack);
    };
    
    var setData = function(data, doneCallBack) {
      var filePath = rootDataPath + '/basic.json';
      var writeFileCallBack = function (err) {
        if (err) console.log('error saving Data.json file ');
        doneCallBack('ok');
      };
      fs.writeFile(filePath, JSON.stringify(data, null, 2), writeFileCallBack);
    };
    
    module.exports.getData = getData;
    module.exports.setData = setData;

    ajax.api。

    import request from 'superagent';
    
    import apiActions from '../actions/api.Actions';
    import saActions from '../actions/sa.Actions';
    
    module.exports = {
      getData() { request.get('/routes/getData').end((err, res) => { this.gotData(res.body); }); },
      gotData(data) { saActions.gotData1(data); saActions.gotData2(data); saActions.gotData3(data); },
      setData(data) { request.post('/routes/setData').send(data).end((err, res) => { apiActions.apiInitDone(); }) },
    };

    api.store。

    import Reflux from 'reflux';
    
    import Actions from '../actions/api.Actions';
    import ApiFct from '../utils/sa.api';
    
    let ApiStoreObject = {
      newData: {
        "React version": "0.14",
        "Project": "ReFluxSuperAgent",
        "currentDateTime": new Date().toLocaleString()
      },
      listenables: Actions,
      apiInit() { ApiFct.setData(this.newData); },
      apiInitDone() { ApiFct.getData(); },
      apiSetData(data) { ApiFct.setData(data); }
    }
    const ApiStore = Reflux.createStore(ApiStoreObject);
    export default ApiStore;

    data.store。

    import Reflux from 'reflux';
    
    import Actions from '../actions/sa.Actions';
    import AddonStore from './Addon.Store';
    import MixinStoreObject from './Mixin.Store';
    
    function _GotData(data) { this.data1 = data; BasicStore.trigger('data1'); }
    
    let BasicStoreObject = {
      init() { this.listenTo(AddonStore, this.onAddonTrigger); },
      data1: {},
      listenables: Actions,
      mixins: [MixinStoreObject],
      onGotData1: _GotData,
      onAddonTrigger() { BasicStore.trigger('data2'); },
      getData1() { return this.data1; },
      getData2() { return AddonStore.data2; },
      getData3() { return this.data3; }
    }
    const BasicStore = Reflux.createStore(BasicStoreObject);
    export default BasicStore;

    组件。

    import React from 'react';
    
    import BasicStore from '../stores/Basic.Store';
    
    let AppCtrlSty = {
      height: '100%',
      padding: '0 10px 0 0'
    }
    
    const getState = () => {
      return {
        Data1: BasicStore.getData1(),
        Data2: BasicStore.getData2(),
        Data3: BasicStore.getData3()
      };
    };
    
    class AppCtrlRender extends React.Component {
       render() {
        let data1 = JSON.stringify(this.state.Data1, null, 2);
        let data2 = JSON.stringify(this.state.Data2, null, 2);
        let data3 = JSON.stringify(this.state.Data3, null, 2);
        return (
          <div id='AppCtrlSty' style={AppCtrlSty}>
            React 1.4 ReFlux with SuperAgent<br/><br/>
            Data1: {data1}<br/><br/>
            Data2: {data2}<br/><br/>
            Data3: {data3}<br/><br/>
          </div>
        );
      }
    }
    
    export default class AppCtrl extends AppCtrlRender {
      constructor() {
        super();
        this.state = getState();
      }
    
      componentDidMount() { this.unsubscribe = BasicStore.listen(this.storeDidChange.bind(this)); }
      componentWillUnmount() { this.unsubscribe(); }
      storeDidChange(id) {
        switch (id) {
          case 'data1': this.setState({Data1: BasicStore.getData1()}); break;
          case 'data2': this.setState({Data2: BasicStore.getData2()}); break;
          case 'data3': this.setState({Data3: BasicStore.getData3()}); break;
          default: this.setState(getState());
        }
      }
    }

    app.js。

    'use strict';
    
    import React  from 'react';
    import ReactDom  from 'react-dom';
    
    import AppCtrl from './components/app.ctrl.js';
    import Actions from './actions/api.Actions';
    import ApiStore from './stores/Api.Store';
    
    window.ReactDom = ReactDom;
    
    Actions.apiInit();
    
    ReactDom.render( <AppCtrl />, document.getElementById('react') );

    来自https://github.com/calitek/ReactPatternsReact.14/ReFluxSuperAgent。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 2017-10-07
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多