【问题标题】:React.js - Setting initial state and defining props which utilize that state within a componentReact.js - 设置初始状态并定义在组件中利用该状态的道具
【发布时间】:2015-08-22 14:58:32
【问题描述】:

我已阅读:

ReactJs: How to pass the initial state while rendering a component?

ReactJS: Why is passing the component initial state a prop an anti-pattern?

我仍然无法解决这个问题。即 - 使用依赖于父组件初始状态的道具渲染一组子组件声明。

我是 reactjs 新手,对开发有点陌生。任何帮助将不胜感激。

boardCreation: function() {
    var board = [];
    for (var i = 0; i < 6; i+=1) {
        board.push(<Card key={i} onClick={this.onCardFlip} image={this.state.imagesArray[i]} flipped={this.flipped[i]} cardIndex={i} />);
    }; 
    return board;
},
getInitialState: function() {
    return {
        imagesArray: this.shuffledImages(['walle.jpg', 'walle.jpg', 'eve.jpg', 'john.jpg', 'captain2.jpg', 'mary.jpg']),
        flipped: [false, false, false, false, false, false],
        flippedImages: [],
        walleCount: 0,
        board: this.boardCreation(),
    }
},

以上返回'Uncaught TypeError: Cannot read property 'imagesArray' of null'。

最初我在这个父组件的渲染函数中创建了棋盘 - 但是棋盘和所有其他状态将需要在每次游戏结束和新游戏开始时重置。

谢谢。

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    问题是由于您在getInitialState 函数中调用了this.boardCreation() 而引起的。因此尚未创建初始状态,这就是您拥有null 的原因。

    要解决这个问题,你可以简单地重构代码

    boardCreation: function (images, flipped) {
        images = images || this.state.images;
        flipped = flipped || this.state.flipped;
        var self = this;
        return images.map(function (image, i) {
             return <Card key={i} onClick={self.onCardFlip} image={image} flipped={flipped[i]} cardIndex={i} />;
        });
    },
    getInitialState: function() {
        var images =  this.shuffledImages(['walle.jpg', 'walle.jpg', 'eve.jpg', 'john.jpg', 'captain2.jpg', 'mary.jpg']);
        var flipped = [false, false, false, false, false, false];
        return {
            imagesArray: images,
            flipped: flipped,
            flippedImages: [],
            walleCount: 0,
            board: this.boardCreation(images, flipped),
        };
    }
    

    我还建议以更 OOP 的方式重构您的代码:您可以有一个卡片对象,包含 imageflippedindex 等属性。

    【讨论】:

    • 感谢您的建议和重构 - 即使我在 images.map 函数调用中包含另一个括号,您的代码也会在参数列表之后显示 Uncaught SyntaxError: missing ) return images.map((image, i) =&gt; { return (&lt;Card key={i} onClick={this.onCardFlip} image={image} flipped={this.flipped[i]} cardIndex={i} /&gt; )})
    • 你在转译到 ES5 吗?
    • 不确定 - 使用 jsx --watch src/ build/
    • 好吧,那你不是。我已经用 ES5 重写了。
    • 现在this.onCardFlip 也有类似的问题。我似乎必须在其他函数中为状态值创建“临时”值。例如在需要读取状态的onCardFlip 中,我也必须在那里创建一个flipped = flipped ||...
    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 2019-07-12
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多