React と ReFlux を利用するプロジェクトに取り組んでいます。現在、ReFlux ストアは 1 つだけですSubscriptionStore.js
。これには、サブスクリプションに添付された各「タイトル」に関する詳細を含むネストされたオブジェクトの配列など、ユーザーのサブスクリプションに関する単純な詳細が含まれています。
背後にあるデータの簡単な内訳は次のSubscriptionStore.js
とおりです。
{
hasThisSubcription: 0
hasThatSubscription: 1
nextPeriodStart: "2015-10-12"
nextYearStartDate: "2016-09-12"
accountTitles: [{
id: "1"
title: "The Name"
createdDate: "2015-09-12 16:17:08"
}, {
id: "2"
title: "Another Name"
createdDate: "2015-09-12 16:17:08"
}, {
id: "3"
title: "Yet Another Name"
createdDate: "2015-09-12 16:17:08"
}]
}
ユーザーが既存のタイトルの名前を更新したり、新しいタイトルを追加したり、タイトルを削除したりできる React コンポーネントがあります。追加と名前の変更はうまくいっていますが、削除は動作がおかしくて、React/ReFlux をまだ完全に把握していないためだと確信しています。
このメイン コンポーネントの関連コードは次のとおりです。
var React = require('react')
var Reflux = require('reflux')
var SubscriptionActions = require('../../stores/SubscriptionActions.js')
var SubscriptionStore = require('../../stores/SubscriptionStore.js')
module.exports = React.createClass({
mixins: [
Reflux.connect(SubscriptionStore, 'subscriptions')
],
/**
* Add new title
* @param {number} id The Title ID
*/
addTitle() {
SubscriptionActions.addNewTitle()
},
/**
* Remove Title from state using on ID
* @param {number} id The Title ID
*/
removeTitle(id) {
SubscriptionActions.removeNewTitle(id)
},
/**
* Update Title title using ID
* @param {number} id The Title ID
* @param {string} value The new title
*/
saveTitle(id, value) {
SubscriptionActions.updateNewTitle(id, value)
},
render() {
// Check for Title subscriptions and create an editable field for each
var theTitles = []
for (var i = 0; i < this.state.subscriptions.accountTitles.length; i++) {
theTitles.push(
<EditableCapsule
key = {i}
ref = {'title' + i}
removable = {i === 0 ? false : true}
labelValue = ''
clickToRemove = {this.removeTitle.bind(this, i)}
primaryAction = {this.saveTitle.bind(this, i)}
/>
)
}
return (
<div>
<ScrollArea ref='scrollArea'>
{theTitles}
</ScrollArea>
</div>
)
}
})
そして、からの関連するコードのビットSubscriptionStore.js
:
removeTitle(id) {
this.subscriptions.accountTitles = _.without(this.subscriptions.accountTitles, _.findWhere(this.subscriptions.accountTitles, { id: id }));
this.trigger(this.subscriptions)
}
問題
どのタイトルをクリックして削除しても、削除されるのは常に最後のタイトルです。コンテンツの前後を吐き出すthis.subscriptions.accountTitles
と、正しいオブジェクトが実際にデータから削除されていることが示されますが、React は常に最後のアイテムが削除されているかのように要素をレンダリングしています。
何が起こっているのでしょうか?