Reactで写真共有兼検索プログラムを制作中にCSSを制御してみようとしたのですが、
反映されません。
方法はCSS-loaderを使ってみて、webpack-dev-serverもnpm startも正常に動いていますが、ロード時にJSXのclassNameが何も表示されていない状態です。
参考ページはここなどです。
ReactでCSSを使う
ここに記載されているプラグインは全部インストールしています。
使用環境
- Apache 2.4.6
- npm: 6.14.6
採用しているReactの記法はクラスコンポーネントです。現在は、CSSのデザイン制御以外は正常に動作しています。
ソースコード
メインのJSX
js
1import React from "react"; 2import City from '../../json/city.json'; 3import State from '../../json/state.json'; 4import styles from './style.css'; 5 6export default class Main extends React.Component { 7 //定義 8 constructor(){ 9 super(); 10 this.state = { 11 countries:[ 12 {id:1,ab:"US",name:"United States"}, 13 {id:2,ab:"JP",name:"Japan"}, 14 {id:3,ab:"CN",name:"China"}, 15 ], 16 states:State, 17 cities:City, 18 word: "", //プロパティの定義 19 selectCountry: "", 20 selectState: "", 21 searchWord: "", 22 li_data: [], 23 hits: [] 24 }; 25 this.optionCountry = this.state.countries.map((item)=> 26 <option key={item.id.toString()} value={item.ab}>{item.name}</option> 27 ); 28 //リアクティブ制御 29 this.selectCountry = this.selectCountry.bind(this); //リアクティブにさせる定義 30 this.selectState = this.selectState.bind(this); //リアクティブにさせる定義 31 this.searchWord = this.searchWord.bind(this); 32 } 33 34 //国名を選択 35 selectCountry(elem){ 36 const cities = this.state.cities 37 this.setState({ selectCountry: elem.target.value }); 38 const hits = cities.filter((item,key)=>{ 39 console.log(item) 40 console.log(elem.target.value) 41 console.log(item.state) 42 return item.state == elem.target.value 43 }) 44 this.setState({hits: hits}) 45 } 46 //エリアを選択 47 selectState(elem){ 48 const cities = this.state.cities 49 const hits = cities.filter((item,key)=>{ 50 console.log(elem.target.value) 51 console.log(item.state) 52 return item.state == elem.target.value 53 }) 54 this.setState({hits: hits}) 55 } 56 //フリーワード検索 57 searchWord(e){ 58 const word = e.target.value 59 const cities = this.state.cities 60 const hits = cities.filter((item,key)=>{ 61 return item.name.includes(word) 62 }) 63 this.setState({hits: hits}) 64 } 65 clear(){ 66 //this.selectCountry( null) 67 } 68 69 70 71 //レンダリングを行う記述 72 render() { 73 return ( 74 <> 75 <label> 国の選択 </label> 76 <select onChange={this.selectCountry} > 77 <option >-- 国名を選択 --</option> 78 {this.optionCountry} 79 </select> 80 <label> エリアの選択</label> 81 <select onChange={this.selectState} > 82 <option >-- エリアを選択 --</option> 83 { 84 this.state.states.map((item,key)=>{ 85 if(item.country == this.state.selectCountry){ 86 return ( 87 <option key={item.id} value={item.code}> 88 {item.name} 89 </option> 90 ) 91 } 92 }) 93 } 94 </select> 95 <br/> 96 <h4>検索文字を入力してください</h4> 97 <input type="text" onChange={ this.searchWord} /> 98 <button onClick={ this.clear }>clear</button> 99 <div>ヒット数:{this.state.hits.length}件</div> 100 <ul className={styles.ulDatas}> 101 { 102 this.state.hits.map((item,key)=>{ 103 return( 104 <li className={styles.liData} key={item.id}> 105 <label className={styles.lbHit}>{ item.name }</label> 106 <br /> 107 <img className={styles.imageStyle} src={`../../img/${item.src}`} alt={ item.name } /> 108 </li> 109 ) 110 }) 111 } 112 </ul> 113 114 </> 115 ); 116 } 117} 118
css
1.ulDatas{ 2 width: 800px; 3 display: block; 4 margin: 0px; 5} 6.liData{ 7 width: 198px; 8 height: 198px; 9 display: inline-block; 10 vertical-align: top; 11 border: 1px brown solid; 12 border-radius: 0 0 10px 0; 13 margin: 5px; 14} 15.imageStyle{ 16 max-width: 90%; 17 margin-left: 5%; 18 margin-right: 5%; 19} 20.lbHit{ 21 background-color: black; 22 color: white; 23 font-weight: bold; 24 padding: 1px 0 1px 2px; 25 width: 196px; 26 height: 22px; 27 display: block; 28}
webpack.config.js (使用しているバージョンは4.3)
js
1//一部抜粋 2 module: { 3 rules: [{ 4 test: /.jsx?$/, 5 exclude: /(node_modules|bower_components)/, 6 use: [{ 7 loader: 'babel-loader', 8 options: { 9 presets: ['@babel/preset-react', '@babel/preset-env'] 10 } 11 }] 12 }, 13 { 14 test: /.css$/, 15 use: [ 16 { 17 loader: 'css-loader', 18 options :{ 19 modules : true 20 } 21 }, 22 ], 23 }, 24
やってみたこと
- cssファイルをディレクトリ直下からcomponentsと同階層に
- style.cssに記載したクラス名称をキャメルケースに変更
- サーバの再起動
根本的な問題なのか、JSXの中に何もクラス名が記載されていないままとなっており、解決の糸口が見えていないので助言いただけたらと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。