前提
reactでMaterial UIのTextFieldを使って開発しています。
TextFieldのdefaultValueという属性を使用したいのですが、一方はうまくいっているのに対して、他方はうまくいっておりません。
コードが長すぎるため、必要だと思うところのみコードを載せますので、載せていない部分のコードが必要であれば教えてください。
label="お客様コード" の方のTextField だとdefaultValueを設定できるが、label="担当者"の方のTextFieldのdefaultValueが設定できません。
Material UIのdefaultValueのドキュメントをみると、「Use when the component is not controlled」と書かれているが、それが原因なのでしょうか?よくわからず困っています。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- TextFieldにdefaultValueを設定したい
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
test.jsx
1 2import { NohinHeaderContext } from '../../providers/setNohinHeaderProvider'; 3import { useGetNohinHeaderInfo } from '../../../hooks/useGetNohinheaderInfo'; 4import {TextField} from '@mui/material'; 5 6 const { nohinHeader, setNohinHeader } = useContext(NohinHeaderContext); 7 8 useGetNohinHeaderInfo(); 9 10export const test =() =>{ 11 12return( 13 <TextField variant="standard" label="自社担当者" sx={{ m: 1 }} 14 defaultValue={nohinHeader.representative} /> ★ 15 16); 17} 18
useGetNohinheaderInfo.js
1import { useContext, useEffect } from "react"; 2 import {NohinHeaderContext} from '../components/providers/setNohinHeaderProvider'; 3 4export const useGetNohinHeaderInfo =() =>{ 5 6 const {nohinHeader, setNohinHeader}=useContext(NohinHeaderContext); 7 let newData = {}; 8 useEffect(() => { 9 fetch('getnohinheaderinfo.php', { method: 'POST', mode: 'cors', credentials: 'include' } 10 ) 11 .then(response => { 12 if (!response.ok) { 13 throw new Error(`${response.status} ${response.statusText}`); 14 } 15 return response.json(); 16 }) 17 .then(data => { 18 console.log('** fetch: then(data)'); 19 console.log(data); 20 newData={indexno:data.index_no,voucherno:data.voucher_no,customerid:data.customer_id,issueddate:data.issued_date, 21 representative:data.representative,taxr:data.tax_r,taxs:data.tax_s,subtotals:data.subtotal_s,subtotalr:data.subtotal_r, 22 taxamounts:data.tax_amount_s,taxamountr:data.tax_amount_r,totalnotax:data.total_notax,taxamount:data.tax_amount,totalamount:data.total_amount} 23 setNohinHeader(newData); 24 }) 25 .catch((reason) => { 26 console.log('** fetch: catch'); 27 console.log(reason); 28 }); 29 }, []); 30 31 return true; 32}
setNohinHeaderProvider.jsx
1 2import { createContext, useState } from "react"; 3 4export const NohinHeaderContext = createContext({}); 5 6export const SetNohinHeaderProvider = props => { 7 const { children } = props; 8 9 const [nohinHeader, setNohinHeader] = useState({ 10 indexno:"",voucherno: "", customerid: "", issueddate: "", representative: "", 11 taxr: "",taxs:"",subtotals:"",subtotalr:"",taxamounts:"",taxamountr:"", 12 totalnotax:"",taxamount:"",totalamount:"", 13 }); 14 15 return ( 16 <NohinHeaderContext.Provider value={{ nohinHeader, setNohinHeader}}> 17 {children} 18 </NohinHeaderContext.Provider> 19 ); 20 21}; 22
試したこと
★のTextFieldに対してdefaultValueではなくvalue={nohinHeader.representative}とするとカスタムフックから取得した値はきちんと取れてきている。
補足情報(FW/ツールのバージョンなど)
"@mui/material": "^5.10.8",
"react": "^18.2.0",