홈>
아이템을 차례대로 배열하고 싶습니다. 그러나 배열의 마지막 요소 만 표시합니다.
예상 출력에 2 초 후에 "a"가 표시되고 "b"등이 나타납니다.
class Main extends React.Component {
constructor(props) {
super(props)
this.state = {
role: ["a","b","c"],
display: "",
}
}
componentDidMount() {
for (let i of this.state.role) {
setTimeout(() => {
this.setState({ display: i})
}, 2000)
}
}
render() {
return (
<div>
<h3>{this.state.display}</h3>
</div>
)
}
}
ReactDOM.render(<Main />, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id='root'></div>
- 답변 # 1
- 답변 # 2
여러 가지
index
를 사용할 수 있습니다 3 가지 타임 아웃을 만들 수 있습니다.class Main extends React.Component { constructor(props) { super(props) this.state = { role: ["a","b","c"], display: "", } } componentDidMount() { this.state.role.forEach((item, index) => { setTimeout(() => { this.setState({ display: item}) }, 2000*(index+1)) }) } render() { return ( <div> <h3>{this.state.display}</h3> </div> ) } } ReactDOM.render(<Main />, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script> <div id='root'></div>
- 답변 # 3
문제는
for (x of y)
직접 실행하고 세 개의setTimeouts
거의 한 번에 생성 된 경우 마지막 1-2 가지 차이가 1-2ms 차이가 나는 원인 만 나타납니다. 나는for (x in y)
를 사용 대신 항목 색인을 갖습니다. 그런 다음 항목 색인을 사용하여 색인을 기반으로 시간 초과를 계산합니다. 이것이 나의 접근법이다 :import React, { Component } from "react"; export default class Main extends Component { constructor(props) { super(props); this.state = { role: ["a", "b", "c"], display: "" }; } componentDidMount() { for (let i in this.state.role) { setTimeout(() => { this.setState({ display: this.state.role[i], }); }, 2000 * i); } } render() { return ( <> <h3>{this.state.display}</h3> </> ); } }
관련 자료
- oop - 함수에 전달한 후 객체의 Perl 배열 참조 해제
- node.js - 노드 js 자바 스크립트 그룹 json 배열을 하위 배열에 배치하고 시간 간격으로 데이터를 넣습니다
- javascript - 푸시 후 배열에 표시되지 않는 요소
- javascript - EJS 변수로 전달한 후 배열이 문자열로 바뀝니다
- 파이썬 - numpy 배열을 고정 된 부동 숫자로 변환
- reactjs - React가 구성 요소 배열을 렌더링하지 않는 이유는 무엇입니까?
- javascript - mobx 저장소 값을 업데이트 한 후 구성 요소의 render ()가 호출되지 않습니다
- javascript - useeffect의 배열에 데이터를로드 한 후 정렬을 실행하는 방법 - 네이티브 반응
- javascript - knex SELECT 후 배열 값에 액세스
- javascript - 객체에서 배열을 반복 한 후 키에 대한 단일 행으로 배열 만들기
- ReactJS - reactjs - id를 사용하여 배열에서 단일 객체를 렌더링하는 방법은 무엇입니까?
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
문제는 componentDidMount에서 타임 아웃을 만들기 위해 루프를 사용하고 있다는 것입니다. 이러한 경우 루프가 시작 및 setState에서 거의 동일한 2 초 간격으로 해결되는 3 개의 타이머를 즉시 생성하여 완료 한 후 3 개의 상태 업데이트 호출을 모두 일괄 처리하여 마지막으로 만 표시되도록합니다.
이 문제를 해결하기 위해
setInterval
를 사용할 수 있습니다 아래처럼