質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

1731閲覧

React+Reduxでstyled-componentのCSSが正常に反映されない

ichi_13119

総合スコア4

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1グッド

1クリップ

投稿2020/03/15 02:54

前提・実現したいこと

Reduxのmodeの状態によってstyled-componentsのcssを変えたい

発生している問題・エラーメッセージ

propsやlogger上のmodeの値がどう変化しても、cssはtrueの時の値が入っている

該当のソースコード

Appjs

1class App extends React.Component { 2 3 render(){ 4 return ( 5 <div className='App'> 6 <Header /> 7 <Switch> 8 <Route exact path='/' component={Home} /> 9 <Route path='/about' component={About} /> 10 <Route path='/skills' component={Skills} /> 11 <Route path='/products' component={Products} /> 12 <Route path='/contact' component={Contact} /> 13 </Switch> 14 <button 15 type='button' 16 onClick={() => this.props.changeDay()} 17 >click me</button> 18 <button 19 type='button' 20 onClick={() => this.props.changeNight()} 21 >click here</button> 22 <Footer /> 23 </div> 24 ); 25 } 26 } 27 28 29 30const mapStateToProps = state => { 31 return { 32 mode: state.mode.mode 33 }; 34}; 35 36const mapDispatchToProps = dispatch => ({ 37 changeDay: () => { dispatch(changeDay()) }, 38 changeNight: () => { dispatch(changeNight()) }, 39}); 40 41export default 42connect( 43 mapStateToProps, 44 mapDispatchToProps 45) 46(App);

rootReducer

1import { combineReducers } from 'redux'; 2import mode from './mode.reducer'; 3 4const rootReducer = combineReducers({mode}); 5 6export default rootReducer;

modeReducer

1import { DAY, NIGHT } from './mode.actions'; 2 3const initialState = { 4 mode: '' 5} 6 7const modeReducer = (state = initialState, action) => { 8 switch (action.type) { 9 case DAY: 10 return { mode: DAY }; 11 case NIGHT: 12 return { mode: NIGHT }; 13 default: 14 return state; 15 } 16}; 17 18export default modeReducer;

modeAction

1export const DAY = 'DAY'; 2export const NIGHT = 'NIGHT'; 3 4export const changeDay = () => { 5 return { 6 type: DAY, 7 payload: { mode: DAY } 8 }; 9}; 10 11export const changeNight = () => { 12 return { 13 type: NIGHT, 14 payload: { mode: NIGHT } 15 }; 16};

store

1import { createStore, applyMiddleware } from 'redux'; 2import rootReducer from './root-reducer'; 3import logger from 'redux-logger'; 4 5const middlewares = [logger]; 6 7export const store = createStore(rootReducer, applyMiddleware(...middlewares)); 8 9export default { store };

stylejsx

1export const BgColor = css` 2 background-color: ${props => props.mode = 'DAY' ? 'white' : 'black' }; 3`; 4 5export const Color = css` 6 color: ${props => props.mode = 'DAY' ? 'green' : 'yellow'}; 7`;

試したこと

componentDidUpdateを使用してレンダリングされてることは確認しました。
ボタンを押した際にpropsのmodeやloggerのstateで意図した値に変更されていることは確認しました。
initialStateの値を空にしていますが、初回レンダリング時にtrueのcssが反映されています。

補足情報(FW/ツールのバージョンなど)

React+Reduxで作成しています。
style.jsxで共通のcssを決めて各styled-componentに渡しています。
このような場で質問するのは初めてですが、足りない情報等あれば教えてください。
よろしくお願い致します。

s.k👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ぱっと見でここが原因では?と思える箇所があります。styled component を作るところの三項演算子の条件の部分が

修正前:

javascript

1props.mode = 'DAY'

となっていますが、上記は常にtruthyなので、三項演算子の結果も常に :の前の値が返されてしまって、意図したようにはならないです。ですので、

修正後:

javascript

1props.mode == 'DAY'

または

修正後:

javascript

1props.mode === 'DAY'

としてみるといかがでしょうか?
この修正だけで、全てが意図通りに動くかは分かりませんが、何らか問題解決に進展するのではと思います。

投稿2020/03/15 03:07

編集2020/03/15 03:16
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ichi_13119

2020/03/15 03:19

ご回答ありがとうございます。 ===に変更したところ、falseの値が反映されるようになりましたが、modeの値が'DAY'になってもtrueの値にはならない状態になっています。
jun68ykt

2020/03/15 03:39

コメントありがとうございます。 > ===に変更したところ、falseの値が反映されるようになりました とのことですので、とりあえず前に進んだ感じでしょうか? 現状について、 > modeの値が'DAY'になってもtrueの値にはならない状態になっています。 という次の問題については、コード全体を見ていないのではっきりしたことは言えませんが、おそらく、 BgColorおよびColorを使っている箇所に何か問題があるのでは?と推測しています。
ichi_13119

2020/03/15 04:52

前に進んだか、と言われると少し怪しいです。 反映されてるのが、true時の値かfalse時の値かというだけで動きは変わっていないので。。。 使っている箇所の問題としてはpropsで渡している物が違う説が一番怪しそうかなと思っています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問