Meteor + Reactで作業しています。 質問は約正しい方法永続的なデータをローカルにクライアントに格納する。Meteorのクライアント側の永続的なローカルデータ
のは、私は5つの記事のリストを持つコンポーネントList
を持っているとしましょう:
export default class List extends Component {
render() {
return(
<ul>
<li><a href='/article1'>Article 1</li>
<li><a href='/article2'>Article 2</li>
<li><a href='/article3'>Article 3</li>
<li><a href='/article4'>Article 4</li>
<li><a href='/article5'>Article 5</li>
</ul>
);
}
}
その後Article
コンポーネントが/articleN
のようなルートのためにレンダリングされるべきであること、のは言わせて。
export default class Article extends Component {
render() {
return(
<main>
..
</main>
);
}
}
私の目標は、すでに訪問した記事のリストをcontaines VisitedList
コンポーネントを構築することです。
私のソリューションは、persistent-session
パッケージ(link)を使用しています。 persistent-minimongo
のようないくつかのパッケージがありますが、私は安定した解決策が必要です。 u2622:persistent-session
の27kを超えるダウンロードで私はかなり安定していると思った。しかし、再び - 私は確かに分かりません。今私の解決策について。
ComponentDidMount
のArticle
コンポーネントでは、配列要素のような永続セッション変数を使用しています。私に説明させてください。まず、key
historyLength
の変数Session
が存在するかどうかを確認します。そうでない場合(ユーザーが記事ページを最初に訪れたことを意味します)、historyLength
という新しい永続変数を設定し、0になります。この変数を使用して、履歴selfmade "配列"の長さを保存します。
次に、現在の記事が履歴にあるかどうかを確認し、そうでない場合は履歴に追加します。実際に履歴に追加すると、key
historyN
という新しい永続変数が設定されます。ここでは、N = historyLength
です。
コードを単語で説明しようとするよりも、コードを見る方が簡単です。
だからArticle
コンポーネントのコード:
export default class Article extends Component {
componentDidMount() {
if (Session.get('historyLength')) {
console.log('history exists');
} else {
Session.setPersistent('historyLength', 0);
console.log('first history init');
}
var articleInHistory = false;
for(i = 0; i < Session.get('historyLength'); i++) {
var key = 'history' + i;
if(Session.equals(key, this.props.articleName)) {
articleInHistory = true;
console.log('already in history:', i);
} else {
console.log(i, 'product is not in history');
}
}
if(!articleInHistory) {
var newHistoryKey = 'history' + (Session.get('historyLength'));
Session.setPersistent(newHistoryKey, this.props.articleName);
var curHistoryLength = Session.get('historyLength');
Session.setPersistent('historyLength', curHistoryLength + 1);
}
}
render() {
return(
<main>
..
</main>
);
}
}
このコードは正しく動作します。私は、任意のコンポーネントでSession.get('historyLength')
にアクセスして、for
ループを訪問した記事の名前を取得することができます:
for(i = 0; i < Session.get(historyLength); i++) {
let key = "history" + i;
console.log(key, Session.get(key));
}
は最後にVisitedList
コンポーネント:
export default class VisitedList extends Component {
renderVisited() {
var visitedArticles = [];
for(i = 0; i < Session.get(historyLength); i++) {
let key = "history" + i;
visitedArticles.push(Session.get(key));
}
return visistedArticles.map((each) => {
return <li> {each} </li>
}
}
render() {
return(
<ul>
{ this.renderVisited() }
</ul>
);
}
}
私の質問は:保存するは私のソリューションであり、正しい方法とローカル永続データを使用しますか?この例は単純で実際のプロジェクトからではありませんが、問題とその解決方法を示しています。
私はこのような履歴ブロックを自分のプロジェクトとショッピングカートに組み込みます。だから、この問題を解決するために、より効率的で、迅速かつ適切な方法があれば、私はそれを知りたければ、始める前に知りたい。あなたの答えをありがとう!
あなたの答えに感謝します!実際に私はReduxについての言及を見ましたが、それについて何も知らない。通常の反応アプリでreduxを使用する理由は明らかです。コンポーネントは状態のみを持ち、使い捨てです。流星を使って、セッションのような別の楽器があります。私は時間が本当に限られているので、新しい技術(redux)をやり直すには少なくとも2,3日かかります。私はreduxが既にアプリケーションのビルドの別の方法であると見ています。 –
基本ツールや小さなパッケージを使って、流星群の中にヒストリーブロックやショッピングカートのようなものを実装する方法を知りたい。 –