質問したいこと
以下のような親(SideBar)と子(PaperFolder)の関係にあるコンポーネントをReactで書いています。
javascript
1class SideBar extends React.Component { 2 constructor(props) { 3 super(props); 4 5 this.state = { 6 folders: [], 7 isSelected: false, 8 }; 9 10 this.createFolder = this.createFolder.bind(this); 11 this.changeBackColor = this.changeBackColor.bind(this); 12 } 13 14 changeBackColor(message) { 15 this.setState({isSelected: !this.state.isSelected}); 16 } 17 18 createFolder() { 19 this.setState({ 20 folders: this.state.folders.concat( 21 <PaperFolder 22 key={this.state.numFolders} 23 isSelected={this.state.isSelected} 24 changeBackColor={this.changeBackColor} 25 /> 26 ) 27 }); 28 } 29 30 render() { 31 return ( 32 // ... 33 ) 34 } 35}
javascript
1class PaperFolder extends React.Component { 2 constructor(props) { 3 super(props); 4 5 this.state = { 6 name: "Untitled", 7 selected: false, 8 } 9 10 this.select = this.select.bind(this); 11 } 12 13 select() { 14 this.props.changeBackColor(); 15 } 16 17 render() { 18 const { classes } = this.props; 19 const filenameText = <ListItemText primary={this.state.name} onDoubleClick={this.openTextbox}/>; 20 const inputText = <TextField 21 value={this.state.value} 22 onChange={this.handleValue} 23 onKeyDown={this.rename} 24 autoFocus 25 />; 26 const folderStyle = clsx({ 27 [classes.folder]: true, 28 [classes.selected]: this.props.isSelected, 29 }); 30 31 return ( 32 <List className={classes.folder} onClick={this.select}> 33 <ListItem 34 className={folderStyle} 35 onClick={this.handleListClick} 36 > 37 // ... 38 </ListItem> 39 </List> 40 ) 41 } 42} 43 44const styles = theme => ({ 45 folder: { 46 paddingBottom: 0, 47 paddingTop: 5, 48 }, 49 50 selected: { 51 backgroundColor: "#e6e6e6", 52 } 53}); 54 55 56export default withStyles(styles)(PaperFolder); 57
親のstateであるisSelected
を子のpropsとして渡しています。ここで、子要素がクリックしたときに子のselected()
というメソッドが呼び出されて、その中では親コンポーネントのchangeBackColor()
を呼び出しています。
親のchangeBackColor
ではisSelected
の反転を行っています。
私は親と子のisSelected
が関連付けられているのでこの処理によって子のisSelected
も更新されるだろうと考えていたのですが、結果は(親の)this.state.isSelected
は更新されるのに(子の)this.props.isSelected
は更新されないという挙動になってしまいました。
子のthis.props.isSelected
に親の変更を反映させるためにはどうすれば良いのでしょうか?初歩的な質問ですがよろしくおねがいします。
追記
maisumakunさんの指摘を受けてList要素を直接配列に入れるのではなく、要素の持つ情報のみを配列に入れ、List要素自体はmap
を使って生成するように変更しましたが、未だに親要素のisSeletected
は更新されるのに小要素のものは更新されないという現象が続いています。
javascript
1class SideBar extends React.Component { 2 constructor(props) { 3 super(props); 4 5 this.state = { 6 folders: [], 7 isSelected: false, 8 }; 9 10 this.createFolder = this.createFolder.bind(this); 11 this.changeBackColor = this.changeBackColor.bind(this); 12 } 13 14 changeBackColor(message) { 15 this.setState({isSelected: !this.state.isSelected}); 16 console.log(this.state.isSelected); 17 } 18 19 // このメソッドを書き換えた 20 createFolder() { 21 this.setState({ 22 folders: this.state.folders.concat( 23 { 24 key: this.state.numFolders, 25 isSelected: this.state.isSelected, 26 deleteFunc: this.deleteFolder, 27 changeBackColor: this.changeBackColor 28 } 29 ) 30 }); 31 } 32 33 34 render() { 35 const { classes } = this.props; 36 const folders = this.state.folders; 37 38 return ( 39 <Drawer 40 variant="permanent" 41 classes={{ 42 paper: sidebarStatus // hayashi: what is the paper? 43 }} 44 open={this.state.isOpen} 45 > 46 <div className={classes.allFolders}> 47 // map を使って子を生成するようにした 48 { folders.map((folder) => 49 <PaperFolder 50 key={folder.key} 51 isSelected={folder.isSelected} 52 deleteFunc={folder.deleteFunc} 53 changeBackColor={folder.changeBackColor} 54 /> 55 )} 56 </div> 57 </Drawer> 58 ) 59 } 60} 61
回答1件
あなたの回答
tips
プレビュー