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

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

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

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

Q&A

解決済

2回答

439閲覧

render時の処理方法

naonao11

総合スコア97

React.js

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

0グッド

0クリップ

投稿2019/03/06 22:36

render()を行う際にpropsの値をsetStateしたいのですが。うまくいきません。。。

今回自身が行いたいこと
編集ホームの作成

js

1import React, { Component } from 'react'; 2import { Redirect } from 'react-router-dom'; 3 4import TitleField from './form/TitleField'; 5import SubmitButton from './form/SubmitButton'; 6 7import { Paper, Grid, Typography } from '@material-ui/core'; 8 9class editProduct extends Component{ 10 11 constructor(props){ 12 super(props); 13 this.state = { 14 data: { 15 title: this.props.title 16 } 17 }; 18 this.checkValue = this.checkValue.bind(this); 19 this.handleSubmit = this.handleSubmit.bind(this); 20 } 21 22 checkValue(type, value){ 23 const data = { 24 title: this.state.data.title 25 }; 26 data[type] = value; 27 this.setState({data: data}); 28 } 29 30 handleSubmit(event){ 31 const {title} = this.state.data; 32 this.props.onPut(event, this.props.match.params.id, title); 33 } 34 35 render(){ 36 if(this.props.redirect) { 37 return <Redirect to="/"/> 38 } 39 40 41 //productをこの画面にレンダリングした瞬間setStateしたい 42 const { product } = this.props; 43 44 //こいつを出したい 45 // const { title } = this.state.data; 46 return( 47 <React.Fragment> 48 <Paper> 49 <Typography variant="h5">Edit Product</Typography> 50 <Grid> 51 <Grid> 52 <TitleField onCheckValue={this.checkValue.bind(this)} title={product.title}/> 53 </Grid> 54 <Grid> 55 <SubmitButton onSubmit={this.handleSubmit.bind(this)}/> 56 </Grid> 57 </Grid> 58 </Paper> 59 </React.Fragment> 60 ); 61 } 62 63} 64export default editProduct; 65 66 67//inputFormについて 68import React from 'react'; 69import { Input } from '@material-ui/core'; 70 71const TitleField = (props) => { 72 const handleCheckValue = (event) => { 73 const type = event.target.name; 74 const value = event.target.value; 75 props.onCheckValue(type, value, event); 76 } 77 78 return( 79 <Input 80 value={props.title} 81 onChange={handleCheckValue} 82 /> 83 ); 84} 85 86export default TitleField;

現状だと、inputタグに打ち込むことができません。
ご助力よろしくお願いいたします。。。

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

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

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

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

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

guest

回答2

0

ベストアンサー

render()を行う際にpropsの値をsetStateしたい

componentDidUpdate を利用可能かと存じます。
こちらは、render後に呼ばれる関数となります。厳密にいうと実行順序としては
render() → componentDidUpdate() となります。

詳細はマニュアルをご参照ください。

マニュアル:
https://reactjs.org/docs/react-component.html#componentdidmount
https://reactjs.org/docs/react-component.html#componentdidupdate

例:

JavaScript

1componentDidUpdate(prevProps) { 2 if (prevProps.product !== this.props.product) { 3 this.setState({}); // this.props.product をsetState 4 } 5} 6

投稿2019/03/09 08:13

engineer_jp_us

総合スコア100

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

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

0

親のコンポーネントから、初期値を設定する場合は、valueではなくdefaultValueを使うと良いです。

jsx

1return( 2 <Input 3 defaultValue={props.title} 4 onChange={handleCheckValue} 5 /> 6 );

投稿2019/03/07 00:30

noka_blank

総合スコア252

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

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

naonao11

2019/03/07 07:39

ありがとうございます! defaultValueにするとproductのデータを取ってこなくなってしまいました。。。
noka_blank

2019/03/07 16:16

入力はできるようになった、という事でしょうか? productは見たところeditProductコンポーネントのさらに親のコンポーネントから渡されているようですが、それは正常に渡されていますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問