export default function Contacts()
{
const [toSend, setToSend] = useState({
from_name: '',
to_name: '',
message: '',
reply_to: '',
confirmation: null
});
const validateAndSend = () =>
{
let isValid = true;
let stop = false;
const elementList = document.querySelectorAll("input");
elementList.forEach(
(e) => {
if (e.value === ("") && stop === false)
{
alert("You must fill every field of the form!");
isValid = false;
stop = true;
}
}
);
if (isValid === true)
{
send(
'service_id',
'template_id', /
toSend,
'user_id')
.then( (response) => {
console.log("Email sent successfully!", response.status, response.text);
})
.catch( (err) => {
console.log('Error sending email: ', err);
});
const confirmationComponent = (Email sent successfully to website's administrator. You will be contacted at the email address you've just provided.
) ;
setToSend({ ...toSend, confirmation: { confirmationComponent } });
};
};
const handleChange = (e) =>
{
setToSend({ ...toSend, [e.target.name]: e.target.value })
};
return (
Contact us!
{ toSend.confirmation }
);
}
私はクラスコンポーネントに精通しています。このconfirmationComponentをクラスコンストラクターのクラス変数として宣言して、render()を含むクラスのすべてのメソッドに対する可視性のスコープを与え、その後、状態を更新します。フォームがユーザーによって送信され、render()メソッドの戻り値で生成されたコンポーネント({this.confirmationComponent}と呼ばれる)が表示されます。
関数コンポーネントが非常に似ていることは知っていますが、機能させることはできません...
また、グローバル関数変数「varconfirmationComponent」を宣言してnullに初期化し、検証後に段落に変更するというアイデアもありました。コンポーネントは、次のように「役に立たない」setStateを実行した後に更新する必要があります。setToSend({... toSend、confirmation:true});
したがって、次のようになります。
export default function Contacts()
{
var confirmationComponent = null;
const [toSend, setToSend] = useState({
from_name: '',
to_name: '',
message: '',
reply_to: '',
confirmation: null
});
const validateAndSend = () =>
{
let isValid = true;
let stop = false;
const elementList = document.querySelectorAll("input");
elementList.forEach( /* Controllo se sono stati compilati tutti i campi del form */
(e) => {
if (e.value === ("") && stop === false)
{
alert("You must fill every field of the form!");
isValid = false;
stop = true;
}
}
);
if (isValid === true)
{
send(
'service_ID',
'template_ID',
toSend,
'user_ID')
.then( (response) => {
console.log("Email sent successfully!", response.status, response.text);
})
.catch( (err) => {
console.log('Error sending email: ', err);
});
confirmationComponent = (Email sent successfully to website's administrator. You will be contacted at the email address you've just provided.
) ;
setToSend({ ...toSend, confirmation: true });
};
};
const handleChange = (e) =>
{
setToSend({ ...toSend, [e.target.name]: e.target.value })
};
return (
Contact us!
{ confirmationComponent }
);
}
残念ながら、このソリューションはどちらも機能せず、その段落はレンダリングされません。ただし、電子メールは正常に送信され、変数confirmationComponentへの割り当ても同様に行われます。
const Confirmation = toSend.confirmation;
最初のメソッドの直前returnで、JSX形式で記述してリターンブロックにレンダリングします。