2016-08-11 22 views
-2

私はReactでWord Clockを作成しようとしています...しかし、私の子コンポーネントは新しい小道具を送信しても再レンダリングしません。正しい時間が表示されるように、私はページをリフレッシュする必要があります... コンポーネントのライフサイクルについて読んだところ、私はそれを正しくやっていると思っていましたが、そうではないようです。私が推測するのは、親コンポーネントでレンダリングすると、これは一度しかレンダリングされず、毎秒setState()の状態を常に更新していて、時間を更新しても再描画しないということです。 ここにコードがあります:デモ、私はFacebookの作成反応するアプリ子Reactコンポーネントは再レンダリングされません

import React, { Component } from 'react'; 
import logo from './logo.svg'; 
import './App.css'; 

https://jsfiddle.net/dLtedtm0/を使用しているだけでapp.jsファイルを働いていない

+0

達成しようとしていることを解読するのは少し難しいです。私はあなたのコードをもう一度見てみることをお勧めします。 ES5とES6 Reactコンポーネントを使用していますが、これは問題ありませんが、ES5型メンバーメソッドとES6型メンバーメソッドの間で混乱することもあります。 'componentDidMount(){}'はES6であり、 'componentDidMount:function(){}'はReactコンポーネントのメンバーメソッドを宣言するES5の方法です。人々があなたの主な問題を簡単に解決できるように修正してください。それとももっと良いことに、あなたはそれを自分で解決します。 – Mihir

+0

はい、私はEs5とEs6の両方を使っていることを知っています。なぜなら、Babelはすべてをコンパイルするからです。それは私の最初のReactプロジェクトなので、たくさんのことを混乱させようとしています。 – Lukeout

+0

ES5およびES6コンポーネントを使用しているだけでなく、ES5コンポーネントでES6メンバーメソッドを使用しています。あなたは少なくともそれを避けるべきです。あなたの問題に関しては、@wintveltが正しく答えています! – Mihir

答えて

2
あなたが何かを説明するために、あなたのコード内のいくつかのドキュメントを提供することができればそれが役立つだろう

コードがするはずです。言っ

、ここにいくつかのあなたは正しい方向に軌道に乗るためのヒントがあります:あなたの<Text>

  • が、あなたはhighlight()を呼び出すcomponentWillReceiveProps(nextProps)機能を持っています。 highlight関数は、小道具に基づいて状態を変更します。しかし:あなたがcomponentWillReceiveProps()内にあるため、この時点で小道具まだ(古い値を持って解決するために、あなたが強調表示するnextPropsを渡すことができますしかし、私は完全にテキストコンポーネントから状態を削除するために助言する
  • あなたの。。。 <Text>コンポーネントは状態を持っていますが、必要はありません。コンポーネントのすべての異なるバリアントは、小道具によって決定されます。したがって、レンダリング機能内でレンダリングしたものに小道具を変換するロジックを配置する方が簡単です。メソッドは、render()です。状態は、コンポーネントのライフサイクル中にコンポーネント自体が変更される値(例えば、テキストフィールド内のユーザー入力など)のためのものです。

  • あなたの時計では、getInitialState()を得るにはshowValueを返すだけです。コードの後半には、hours,minutes,secondsも記載されています。 すべてのものをgetInitialState()に初期値を含めて含むことをお勧めします。コードの読者は、このコンポーネントの状態であなたが管理しているものを知ることができます。これは正しい方向にあなたを助ける

・ホープ..

UPDATE:出発点として、あなただけのクロック成分で、単純化されたworking codepen hereを見つけることができます。 状態(現在の時刻)があり、単純に毎秒の時刻をレンダリングします。うまくいけば、そこからコードを追加することができます。

+0

私は、レンダリング関数でロジックを使用するとは思わないと思っていました。そのため、それらを切り離したいのです。私の時計では、クリックがトリガされたイベントのユーザー入力に基づいて時計の色のテーマを変更する予定であるため、showdefaultは状態です。私は、次の小道具を見て回って、それがうまくいくかどうかを見に行くつもりです、ありがとう! – Lukeout

+0

しかし、私はそれが私が常に新しい小道具を送っているとは思わない問題ではないと思いますか? – Lukeout

+0

あなたがフィドルをトリミングすることができれば(例えば、もしも 'if then else'の大部分を取り除く)、コードにしたいコメントを追加すると助けになります。また、変数の説明的な名前が役立つかもしれません。たとえば、汎用変数 'this.props.val'の目的が何であるかはわかりません。 – wintvelt

関連する問題