React.js:使用Fetch API和对象数组中的props加载JSON数据

索菲亚·金(Sophia Gold)

对React.js完全陌生,在阅读了本教程并阅读了文档之后,我仍然在使用js fetch从JSON文件加载数据以及设置对象数组的属性方面有些挣扎。我也不确定我是否可以在事件处理程序中正确访问DOM属性。我一定想念一些简单明了的东西。

作为参考,这里是我的代码与项目的其余部分这里就是它应该的样子。

ETA:从文档中我不知道babel浏览器已被弃用,因此决定只使用带有ES5语法的纯Javascript而不是JSX。代码已在下面更新,但仍未呈现标记。

var CanvasAnimation = React.createClass({
    getInitialState: function() {
        return {data: []};
    },                            
    loadData: function() {
        /*
        fetch("data.json")
            .then(function(response) {
                return response.json    
                    .then(function(json){
                        this.setState({data: json});
                    }.bind(this))
            }.bind(this));
        */
        const data = [
            { id: "stalkerOne", width: 225, height: 434, spriteSheetURL: 'spriteSheets/stalkerone.jpg', rows: 5, columns: 5, totalFrames: 24 },
            { id: "stalkerTwo", width: 175, height: 432, spriteSheetURL: 'spriteSheets/stalkertwo.jpg', rows: 6, columns: 5, totalFrames: 26 },
            { id: "stalkerThree", width: 251, height: 432, spriteSheetURL: 'spriteSheets/stalkerthree.jpg', rows: 6, columns: 5, totalFrames: 28 }
        ];
    },
    componentDidMount: function() {
        this.loadData();
    },
    componentDidUpdate: function() {
        function animation(json) {
            return json.map(function(data) {
                return(
                    new CanvasSprite(
                        document.getElementById(data.id),
                        data.width,
                        data.height,
                        data.spriteSheetURL,
                        data.rows,
                        data.columns,
                        data.totalFrames)
                );
            });
        };
        this.setState({animaton: animation(this.state.data)});  
    },
    handleInteraction: function(event, index) {
        var offsetY = event.clientY - event.node.getBoundingClientRect().top;
        var relY = offsetY/this.state.data.height;
        this.props.animation[index].setFrame(relY);
    },
    render: function() {
        var canvases = this.state.data.map(function(data, index) {
            return (
                React.createElement('canvas', 
                                    id = data.id,
                                    width = data.width,
                                    height = data.height,
                                    style = 'border:5px solid white',
                                    onMouseOver= this.handleInteraction(event, index))
            );
        });
        return(
            React.createElement('div', canvases)
        );
    }
});
  
    
ReactDOM.render(
    React.createElement(CanvasAnimation, null),
    document.getElementById('content')
); 

索菲亚·金(Sophia Gold)

好的,这是工作项目。从@gumingfeng和@hkal获得了一些帮助。

得到教训:

  1. React文档太可笑了。
  2. 直式JS与JSX的imo确实不差。
  3. 纠正了“提取”中的一些语法错误。
  4. 数据加载需要实例化对象数组,以便在构造函数中传递DOM引用。
  5. 但是,setState()在内部调用componentDidUpdate()会触发无限循环,因此必须直接且独立于状态来设置对象数组。
  6. 从数组创建DOM元素时,React不会自动将事件处理程序分配给特定元素。换句话说,必须将其传递给数组索引,以便可以用来访问其在数组中的值。

ew,我想就是这样。希望这对其他人有帮助。

最后,我要说的是,在没有JSX的情况下尝试使用React。真的不是那么糟糕:)

const { Component } = React;
const { render } = ReactDOM;

class CanvasAnimation extends Component {
    
    constructor(){
        super();
        this.state = {
            data: []
        };
    };
    
    componentDidMount() {
        fetch("data.json")
            .then( (response) => {
                return response.json() })   
                    .then( (json) => {
                        this.setState({data: json});
                    });
    };
    
    componentDidUpdate() {
        function animation(json) {
            return json.map( (data) => {
                return(
                    new CanvasSprite(
                        document.getElementById(data.id),
                        data.width,
                        data.height,
                        data.spriteSheetURL,
                        data.rows,
                        data.columns,
                        data.totalFrames)
                );
            });
        };
        //this.setState({animation: animation(this.state.data)}); //causes infinite loop
        this.animation = animation(this.state.data);
    };
    
    handleInteraction(event, index) {
        var offsetY = event.clientY -  document.getElementById(this.state.data[index].id).getBoundingClientRect().top;
        var relY = offsetY/this.state.data[index].height;
        this.animation[index].setFrame(relY);
    };
    
    render() {
        var canvases = this.state.data.map( (data, index) => {
            return (
                React.createElement('canvas', 
                                    {id : data.id,
                                    width : data.width,
                                    height : data.height,
                                    //style : {border: '5px solid white'},
                                    onMouseMove : (event) => this.handleInteraction(event, index)}
                                    )
            );
        });
        return(
            React.createElement('div', null, ...canvases)
        );
    };
    
};
  
    
render(
    React.createElement(CanvasAnimation, null),
    document.getElementById('content')
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 React JS 中使用 Fetch 获取 API 数据

来自分类Dev

带有个人访问令牌的Github API调用与节点JS和React JS的Fetch配合使用

来自分类Dev

我如何从对象数组中获取数据,通过API端点将其传递给使用React的所需对象值.fetch()?

来自分类Dev

使用 Promise.all 和 fetch API 返回的数据动态设置状态对象:React+Typescript

来自分类Dev

针对使用react-native中的fetch检索的json对象验证数据

来自分类Dev

从 props React JS 返回对象数组

来自分类Dev

如何使用React Native Fetch()从API检索格式错误的json

来自分类Dev

如何从javascript数组对象/JSON获取数据并在React JS中使用它

来自分类Dev

如何在React JS中从api访问对象数组?

来自分类Dev

想要从React Js中的API获取数组中的数据

来自分类Dev

使用React.js在数组中追加对象

来自分类Dev

如何使用Meteor和React加载数据?

来自分类Dev

使用 JS Fetch API 的 PHP POST

来自分类Dev

在 React 中使用 Fetch 从服务器获取数据

来自分类Dev

如何使用React Native从api加载数据

来自分类Dev

使用Hook和Fetch更改React组件的状态

来自分类Dev

React/Express Fetch 请求不显示 Json 对象数组

来自分类Dev

在React JS中遍历数组的对象

来自分类Dev

更新 React Js 中的对象数组

来自分类Dev

React Fetch API 数据 - 对象未定义

来自分类Dev

使用props和state在React数组中编辑文本值吗?

来自分类Dev

使用 React JS 显示和修改 JSON 数据(显示在表格中)

来自分类Dev

使用 setInterval 为仪表板实现嵌套的 fetch API 调用:fetch()+React+Typesctipt

来自分类Dev

使用Node JS和React js的文件加载问题

来自分类Dev

从数据库中 fetch() 数据并设置为 React.js 组件状态

来自分类Dev

使用React获取JSON对象数据

来自分类Dev

遍历json对象并使用React显示数据?

来自分类Dev

遍历json对象并使用React显示数据?

来自分类Dev

遍历json对象并使用React显示数据?

Related 相关文章

  1. 1

    在 React JS 中使用 Fetch 获取 API 数据

  2. 2

    带有个人访问令牌的Github API调用与节点JS和React JS的Fetch配合使用

  3. 3

    我如何从对象数组中获取数据,通过API端点将其传递给使用React的所需对象值.fetch()?

  4. 4

    使用 Promise.all 和 fetch API 返回的数据动态设置状态对象:React+Typescript

  5. 5

    针对使用react-native中的fetch检索的json对象验证数据

  6. 6

    从 props React JS 返回对象数组

  7. 7

    如何使用React Native Fetch()从API检索格式错误的json

  8. 8

    如何从javascript数组对象/JSON获取数据并在React JS中使用它

  9. 9

    如何在React JS中从api访问对象数组?

  10. 10

    想要从React Js中的API获取数组中的数据

  11. 11

    使用React.js在数组中追加对象

  12. 12

    如何使用Meteor和React加载数据?

  13. 13

    使用 JS Fetch API 的 PHP POST

  14. 14

    在 React 中使用 Fetch 从服务器获取数据

  15. 15

    如何使用React Native从api加载数据

  16. 16

    使用Hook和Fetch更改React组件的状态

  17. 17

    React/Express Fetch 请求不显示 Json 对象数组

  18. 18

    在React JS中遍历数组的对象

  19. 19

    更新 React Js 中的对象数组

  20. 20

    React Fetch API 数据 - 对象未定义

  21. 21

    使用props和state在React数组中编辑文本值吗?

  22. 22

    使用 React JS 显示和修改 JSON 数据(显示在表格中)

  23. 23

    使用 setInterval 为仪表板实现嵌套的 fetch API 调用:fetch()+React+Typesctipt

  24. 24

    使用Node JS和React js的文件加载问题

  25. 25

    从数据库中 fetch() 数据并设置为 React.js 组件状态

  26. 26

    使用React获取JSON对象数据

  27. 27

    遍历json对象并使用React显示数据?

  28. 28

    遍历json对象并使用React显示数据?

  29. 29

    遍历json对象并使用React显示数据?

热门标签

归档