React-Bootstrap日期输入表单控件如何设置默认文本内容?
How to set default text content in React-Bootstrap date input form control?
我正在使用 React-Bootstrap 和 Hooks 构建一个应用程序,以使用以前已知的值预填充表单。
但是,当呈现日期输入时,它会显示占位符文本 'dd/mm/yyyy' ,尽管元素的基础值包含正确的预设值 ,因此保存操作如果该字段未受影响仍然可以正常工作。
该字段出现在表单组中,单击按钮时表单变为可编辑(将上面屏幕截图中的按钮文本从 'Update' 切换为 'Save',并交换日期字段显示日期选择器而不是显示计算年龄的文本字段):
Form when read only
Form when editable
在功能方面,用户仍然可以 select 字段中的日期和文本然后更新以反映日期 select 按预期编辑,这只是初始默认值未显示的值。这令人沮丧,因为用户可能不需要更改此字段,但如果他们不这样做,它似乎会擦除信息。
我试过使用不同的方法
输入字段代码:
//hooks
const [editable, setEditable] = useState(false);
const [name, setName] = useState(user.name);
const [dob, setDob] = useState(user.dob);
//functions called
export const dateFromDateString = (dateString) => {
return moment(new Date(dateString)).format('YYYY-MM-DDT00:00:00.000');
};
export const dateForPicker = (dateString) => {
return moment(new Date(dateString)).format('YYYY-MM-DD')
};
const calculateAge = (date) => {
return moment().diff(date, 'years', false);
};
//form with irrelevant fields removed
<Form className="personalInfo">
{editable ?
<Form.Group as={Row} className="mb-3 align-items-center" controlId="dobInput">
<Form.Label column lg={4}>Date of Birth:</Form.Label>
<Col>
<Form.Control type="date"
defaultValue={dateForPicker(dob)}
onfocus={dateForPicker(dob)}
placeholder={dob ? dateForPicker(dob) : "dd/mm/yyyy"}
onChange={(e) => setDob(dateFromDateString(e.target.value))}
/>
</Col>
</Form.Group>
:
<Form.Group as={Row} className="mb-3 align-items-center" controlId="ageDisplay">
<Form.Label column id="ageLabel" lg={4}>Age:</Form.Label>
<Col>
<Form.Control type="text" readOnly
value={calculateAge(dateFromDateString(user.dob))}/>
</Col>
</Form.Group>
}
<Form.Group as={Row} className="d-flex justify-content-end" controlId="nameInput">
<Button variant="outline-dark"
size="sm"
className="w-25 mx-2"
id="profileSubmitBtn"
onClick={editable ? saveChanges : () => toggleEditable(editable, setEditable)}
>
{editable ? "Save" : "Update"}
</Button>
</Form.Group>
</Form>
版本:
"bootstrap": "^5.1.3",
“反应”:“^ 17.0.2”,
“反应-bootstrap”:“^2.1.0”,
如果您将输入更改为受控组件,应该可以解决您的问题。你不应该在日期输入上需要 defaultValue
,但如果你想控制组件的值,你肯定需要 value
属性。我在下面做了这些更改。
<Form.Control
type="date"
value={dob ? dateForPicker(dob) : ''}
onfocus={dateForPicker(dob)}
placeholder={dob ? dateForPicker(dob) : "dd/mm/yyyy"}
onChange={(e) => setDob(dateFromDateString(e.target.value))}
/>
我正在使用 React-Bootstrap 和 Hooks 构建一个应用程序,以使用以前已知的值预填充表单。 但是,当呈现日期输入时,它会显示占位符文本 'dd/mm/yyyy' ,尽管元素的基础值包含正确的预设值 ,因此保存操作如果该字段未受影响仍然可以正常工作。
该字段出现在表单组中,单击按钮时表单变为可编辑(将上面屏幕截图中的按钮文本从 'Update' 切换为 'Save',并交换日期字段显示日期选择器而不是显示计算年龄的文本字段):
Form when read only Form when editable
在功能方面,用户仍然可以 select 字段中的日期和文本然后更新以反映日期 select 按预期编辑,这只是初始默认值未显示的值。这令人沮丧,因为用户可能不需要更改此字段,但如果他们不这样做,它似乎会擦除信息。
我试过使用不同的方法
输入字段代码:
//hooks
const [editable, setEditable] = useState(false);
const [name, setName] = useState(user.name);
const [dob, setDob] = useState(user.dob);
//functions called
export const dateFromDateString = (dateString) => {
return moment(new Date(dateString)).format('YYYY-MM-DDT00:00:00.000');
};
export const dateForPicker = (dateString) => {
return moment(new Date(dateString)).format('YYYY-MM-DD')
};
const calculateAge = (date) => {
return moment().diff(date, 'years', false);
};
//form with irrelevant fields removed
<Form className="personalInfo">
{editable ?
<Form.Group as={Row} className="mb-3 align-items-center" controlId="dobInput">
<Form.Label column lg={4}>Date of Birth:</Form.Label>
<Col>
<Form.Control type="date"
defaultValue={dateForPicker(dob)}
onfocus={dateForPicker(dob)}
placeholder={dob ? dateForPicker(dob) : "dd/mm/yyyy"}
onChange={(e) => setDob(dateFromDateString(e.target.value))}
/>
</Col>
</Form.Group>
:
<Form.Group as={Row} className="mb-3 align-items-center" controlId="ageDisplay">
<Form.Label column id="ageLabel" lg={4}>Age:</Form.Label>
<Col>
<Form.Control type="text" readOnly
value={calculateAge(dateFromDateString(user.dob))}/>
</Col>
</Form.Group>
}
<Form.Group as={Row} className="d-flex justify-content-end" controlId="nameInput">
<Button variant="outline-dark"
size="sm"
className="w-25 mx-2"
id="profileSubmitBtn"
onClick={editable ? saveChanges : () => toggleEditable(editable, setEditable)}
>
{editable ? "Save" : "Update"}
</Button>
</Form.Group>
</Form>
版本: "bootstrap": "^5.1.3", “反应”:“^ 17.0.2”, “反应-bootstrap”:“^2.1.0”,
如果您将输入更改为受控组件,应该可以解决您的问题。你不应该在日期输入上需要 defaultValue
,但如果你想控制组件的值,你肯定需要 value
属性。我在下面做了这些更改。
<Form.Control
type="date"
value={dob ? dateForPicker(dob) : ''}
onfocus={dateForPicker(dob)}
placeholder={dob ? dateForPicker(dob) : "dd/mm/yyyy"}
onChange={(e) => setDob(dateFromDateString(e.target.value))}
/>