【问题标题】:Flux, how to correctly reuse components?Flux,如何正确复用组件?
【发布时间】:2016-02-01 14:22:25
【问题描述】:

仍在研究 Flux,我对商店的一些逻辑感到困惑。 假设我创建了一个组件,一个管理投票的单个按钮,例如“是”/“否”开关。

所以我有我的 voteButton 来管理一个 voteAction,它使用一个 Dispatcher 来调用一个改变 votedByViewer 状态的 Store 函数。

一切都很有趣,一切都很好……如果我只有一个按钮。 但如果我有多个,它们共享同一个商店,因此重新渲染会发生在所有多个组件上。

这是我最初的js:

// Parse all DIV for React management
$("#be-content [id*=like]").each(function (index) {
    var div_id = $(this).attr("id");

    // Render the VoteButton
    ReactDOM.render(
        <VoteButton />,
        document.getElementById(div_id)
    )
});

每个 VoteButton 都在页面中正确呈现,但每个开关都会更改所有按钮的状态。这是我的投票按钮:

var voteStore = require('../stores/voteStore') ;
var voteActions = require('../actions/voteActions');

var VoteButton = React.createClass({
    getInitialState: function () {
        return {
            voted: voteStore.getVote()
        }
    },
    componentDidMount: function () {
        voteStore.addVoteListener(this._onChange);
    },
    componentWillUnmount: function () {
        voteStore.removeVoteListener(this._onChange);
    },
    handleVote: function () {
        this.state.voted ? voteActions.unvote() : voteActions.vote()
    },
    _onChange: function () {
        this.setState({
            voted: voteStore.getVote()
        })
    },
    render: function () {
        return (
            <div className="link">
                <button onClick={this.handleVote}>{this.state.voted? 'YES':'NO'}</button>
            </div>
        )
    }
});

module.exports = VoteButton;

知道如何解决它吗?也许我必须使用容器? 谢谢

【问题讨论】:

    标签: reactjs reactjs-flux flux


    【解决方案1】:

    您只需要为您使用的每个按钮设置一个 id。当您单击它时,它会将这个 id 传递给操作,然后是调度程序,然后是商店接收它。 您的商店是一个数组,每个键都是一个按钮 ID。当商店收到数据时,它会更改所需的 id。并且您的按钮获取其 id 的状态 (getVote('buttonid');)

    【讨论】:

    • 所以我的商店,现在就像这个 var _voteStore = {votedByViewer: false},应该转换成键值对数组,对吧?具有在数组中添加新项目的功能,在商店初始化期间使用。是这样吗?
    • 是的,就是这样。它不一定是一个数组,对象也很好,取决于你和你想怎么做,但你明白了,保持和 id,在你的商店中添加新的按钮 id,绑定按钮。
    • _voteStore= { button1:false, button2:true ... } 例如:)
    • 谢谢弗朗索瓦。此外,您对如何管理有任何想法:现在,如果触发了 _onChange 事件,则会为每个 VoteButton 调用渲染函数。如何使用 VoteButton 组件的不同实例,每个实例都有自己的调度程序,最终有自己的存储(与前面所说的数组相反)?在我最初的 js 中,VoteButton 是一个 var: var VoteButton= require('../components/VoteButton') ;
    • 好吧,您可以检查您的 _onChange 函数是否已更改状态,如果是,则设置新状态,否则您什么都不做(if(votestore.getvote('id') != this.state .voted) { //更新状态 } 类似的东西
    猜你喜欢
    • 2017-11-17
    • 2018-03-01
    • 2016-09-12
    • 2015-01-03
    • 2021-01-20
    • 2016-10-19
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多