반응 - 소품을 전달하여 입력 defaultValue 변경
다음 예를 들어 보십시오.
var Field = React.createClass({
render: function () {
// never renders new value...
return (
<div>
<input type="text" defaultValue={this.props.value || ''} />
</div>
);
}
});
var App = React.createClass({
getInitialState: function () {
return {value: 'Hello!'};
},
changeTo: function (str) {
this.setState({value: str});
},
render: function () {
return (
<div>
<Field value={this.state.value} />
<button onClick={this.changeTo.bind(null, 'Whyyyy?')}>Change to "Whyyyy?"</button>
<button onClick={this.changeTo.bind(null, void 0)}>Change to undefined</button>
</div>
);
}
});
React.render(
<App />,
document.getElementById('app')
);
가치를 전달하고 싶다.defaultValue
벙어리 입력 구성 요소의 받침대로서.그러나 그것은 결코 그것을 다시 렌더링하지 않는다.
앞서 언급한 바와 같이,defaultValue
폼의 초기 부하에서만 설정된다.그 이후에는 "자연스럽게" 업데이트되지 않을 것이다. 왜냐하면 그 목적은 초기 디폴트 값을 설정하는 것이었기 때문이다.
만약 당신이 필요하다면, 당신은 이 문제를 해결할 수 있다.key
포장지 구성요소로 이동(예:Field
또는App
구성 요소, 보다 실제적인 환경에서는, 아마도form
구성 요소A goodkey
예를 들어, 데이터베이스에 저장된 ID와 같이 양식에 전달되는 리소스의 고유한 값이 될 수 있다.
간단한 경우 필드 렌더에서 다음을 수행하십시오.
<div key={this.props.value}>
<input type="text" defaultValue={this.props.value || ''} />
</div>
좀 더 복잡한 폼의 경우, 예를 들어 API에 제출되었지만 동일한 페이지에 있는 온미팅 작업과 같은 작업을 원하는 대로 사용할 수 있다.
const Form = ({item, onSubmit}) => {
return (
<form onSubmit={onSubmit} key={item.id}>
<label>
First Name
<input type="text" name="firstName" defaultValue={item.firstName} />
</label>
<label>
Last Name
<input type="text" name="lastName" defaultValue={item.lastName} />
</label>
<button>Submit!</button>
</form>
)
}
Form.defaultProps = {
item: {}
}
Form.propTypes = {
item: PropTypes.object,
onSubmit: PropTypes.func.isRequired
}
제어되지 않은 양식 입력을 사용할 때는 일반적으로 값이 제출될 때까지 상관하지 않기 때문에 defaultValues(제출 후 개별 입력을 변경할 때마다 변경되는 것이 아니라)를 정말로 업데이트하고자 할 때만 강제로 재렌더하는 것이 더 이상적이다.
또한 동일한 양식을 편집하고 API 응답에 다른 값이 표시될 수 있다는 두려움이 있는 경우 id + 타임스탬프 등의 조합된 키를 제공할 수 있다.
defaultValue는 초기 부하에 대해서만 작동한다.그 이후에는 업데이트가 안 될 겁니다.Field 구성 요소의 상태를 유지 관리하십시오.
var Field = React.createClass({
//transfer props to state on load
getInitialState: function () {
return {value: this.props.value};
},
//if the parent component updates the prop, force re-render
componentWillReceiveProps: function(nextProps) {
this.setState({value: nextProps.value});
},
//re-render when input changes
_handleChange: function (e){
this.setState({value: e.target.value});
},
render: function () {
// render based on state
return (
<div>
<input type="text" onChange={this._handleChange}
value={this.state.value || ''} />
</div>
);
}
});
이건 통제된 것과 관련이 있다고 확신해 통제되지 않는 입력.
내가 제대로 이해한다면, 네가 한 일 때문에.<input>
제어되지 않음(정의되지 않음)value
속성), 그러면 값은 항상 초기화된 값으로 결정된다.이 경우Hello!
.
이 문제를 극복하기 위해 a를 추가할 수 있다.value
를 속성으로 하여 설정하다onChange
:
var Field = React.createClass({
render: function () {
// never renders new value...
return (
<div>
<input type="text" defaultValue={this.props.default || ''} value={this.props.value} />
</div>
);
}
});
당신은 조건부로 그리고 당신이 강제로 업데이트하기를 원할 때마다 입력을 할 수 있다.defaultValue
입력을 마운트 해제한 다음 즉시 다시 렌더링하십시오.
이 문제는 다음과 같다.
onClick={this.changeTo.bind(null, 'Whyyyy?')}
나는 네가 왜 null에 속박하는지 궁금하다.
'이것'에 바인딩하여 ChangeTo가 이 객체에 State를 설정하십시오.
이것을 사용해 보십시오.
<button onClick={this.changeTo.bind(this, 'Whyyyy?')}>Change to "Whyyyy?"</button>
<button onClick={this.changeTo.bind(this, void 0)}>Change to undefined</button>
Javascript에서는 함수를 호출할 때, 함수를 작성한 곳이 아니라 호출된 범위(알고 있어, 직관적으로 반대되는 것 같다)에서 호출된다.당신이 쓰는 컨텍스트에서 호출되도록 하려면 '.bind(이것)'가 필요하다.
바인딩 및 기능 범위에 대해 자세히 알아보려면 온라인 tute가 많이 있으며(다른 제품보다 훨씬 나은 제품도 있음) - 이 제품이 마음에 들 것이다: http://ryanmorr.com/understanding-scope-and-context-in-javascript/
또한 Firefox나 크롬을 사용하는 경우 Resact Dev 도구를 사용할 것을 권장한다. 이렇게 하면 state.properties가 변경되지 않았음을 알 수 있을 것이다. https://facebook.github.io/react/blog/2015/09/02/new-react-developer-tools.html
조건부 렌더링을 사용하면 구성 요소가 올바른 초기 값을 로드한다.이 모듈에서와 유사한 기능:
class MenuHeaderInput extends React.Component{
constructor(props){
super(props);
this.handleBlur = this.handleBlur.bind (this);
}
handleBlur (e) {
this.props.menuHeaderUpdate(e.target.value);
}
render(){
if (this.props.menuHeader) {
return (
<div className="w3-row w3-margin" onClick = {() => this.props.handleTitleClick (10)}>
<div className="w3-third" ><pre></pre></div>
<input
className = {"w3-third w3-input w3-jumbo " + EDIT_COLOR}
type = "text"
defaultValue = {this.props.menuHeader}
onBlur = {this.handleBlur}
/>
<div className="w3-third" ><pre></pre></div>
</div>
)
}
else {
return null;
}
}
}
위의 Sia의 훌륭한 대답과 관련: https://stackoverflow.com/a/41962233/4142459.
나의 경우 양식을 업데이트할 수 있는 몇 가지 방법이 있었다.
- 사용자가 양식 필드에 값을 입력할 수 있음
- 사용자가 이전 버전에서 복원할 수 있는 API 요청
- 사용자는 작성된 양식을 탐색할 수 있음(URL의 queryParams 사용)
- 양식 필드 지우기
- 사용자 작업 또는 웹세트에서 모든 필드 또는 단일 변경사항 발생을 허용하는 더 많은 방법.
형식 상태가 입력에 반영되도록 하는 가장 쉬운 방법은 실제로 다음과 같은 것임을 알게 되었다.
- 수동 제어 기능을 제공하려면 다음과 같이 하십시오.
key
폼의 상단 레벨의 받침대 또는 폼의 상위 요소(DOM 트리의 입력 위에 있는 한). - 사용자가 a를 입력할 때
key
업데이트가 필요하지 않다. - 내가 만들었어
key
소박하다formHistoricalVersion
그리고 양식 필드의 값과 상호 작용하는 사용자 입력/선택/기타에 대한 외부 업데이트가 발생함에 따라 나는 형식HistoricalVersion을 증가시켰다. - 이를 통해 사용자 작업에 의한 것인지 API 요청에 의한 것인지 양식의 상태가 동기화되어 있는지 확인할 수 있었다. 나는 그것을 완전히 통제할 수 있었다.
시도한 기타 솔루션:
- API 요청을 하는 동안 전체 양식을 삭제하십시오(양식이 아닌 로딩 스피너로 로드할 때).성능 및 명확한 형태에 대한 단점들 그것은 약간 미친 짓이었지만, 로는 가능하다.
setImmediate
을 때로 변환한 을(乙)을 한다.isLoading
로 돌아가다.false
현지에 - 추ga a
key
각 입력에 대해: 이것은 놀라울 정도로 작동했지만, 사용자들이 타이핑할 때마다 이상한 블립이 있어서 나는 그것을 제거해야만 했다. - 것의 정적((((((((((((((.
field.id
) (위 답변에서 제시된 바와 같이) 내가 가지고 있는 모든 사용 사례는 다루지 않았다.
결론적으로, 양식의 키를 react/remensx로 설정하는 것은 꽤 쉽게 효과가 있었다. 나는 단지 다음과 동등한 것을 추가하겠다.
return {
...state,
formFieldState: payload.formFields,
historicalFormVersion: state.historicalFormVersion + 1
}
이는 일부 타사 라이브러리와 소프로 값을 입력했지만 defaultValue로 사용된 나만의 숫자 입력을 사용하고 있었기 때문에 필요했다.
const NumberDisplay: FunctionComponent = ({ value, setValue }) => (
<input
defaultValue={convertToSpecialNumberDisplay(value)}
onBlur={(e) => convertToSpecialNumberDisplay(e.target.value)}
onFocus={(e) => convertToNumberFromDisplay(e.target.value)}
onChange={(e) => setValue(e.target.value)}
/>
)
전체 형태의 대략적인 환원:
const FullForm: FunctionComponent = () => {
const dispatch = useDispatch();
const formState = useState((state) => state.formState);
const formHistoricalVersion = useState((state) => state.formHistoricalVersion);
return (
<form key={formHistoricalVersion}>
{renderFormFields(formState, dispatch)}
</form>
)
}
나도 이 문제에 직면해 있는데, 소품이 바뀌었을 때 입력값을 수동으로 업데이트한 것이었어.이 항목을 필드 대응 클래스에 추가:
componentWillReceiveProps(nextProps){
if(nextProps.value != this.props.value) {
document.getElementById(<element_id>).value = nextProps.value
}
}
요소에 ID 속성을 추가하기만 하면 찾을 수 있다.
참조URL: https://stackoverflow.com/questions/30727837/react-change-input-defaultvalue-by-passing-props
'programing' 카테고리의 다른 글
Vue.js - 마지막 항목 손실 시 요소-ui el-table v-for (0) | 2022.04.09 |
---|---|
UnicodeEncodeError: 'ascII' 코덱이 위치 20에서 문자 u'\xa0'을 인코딩할 수 없음: 서수가 범위(128)에 없음 (0) | 2022.04.09 |
여러 경로를 한 번에 보여주는 리액트라우터 v4 (0) | 2022.04.09 |
Vue.js에서 동적으로 데이터 바인딩된 텍스트 (0) | 2022.04.09 |
RxJS6 asObservable()이 주제에 필요한가? (0) | 2022.04.09 |