2015 년 수정
누군가 내 솔루션으로 NPM에 프로젝트를 만들었습니다 : https://github.com/lovasoa/react-contenteditable
편집 06/2016 : 브라우저가 방금 제공 한 html을 "재 포맷"하려고 할 때 발생하는 새로운 문제가 발생하여 구성 요소가 항상 다시 렌더링됩니다. 보다
2016 년 7 월 편집 : 여기 내 프로덕션 콘텐츠 편집 가능한 구현입니다. 다음을 react-contenteditable
포함하여 원하는 추가 옵션 이 있습니다.
- 잠금
- HTML 조각을 포함 할 수있는 명령형 API
- 콘텐츠를 다시 포맷하는 기능
요약:
FakeRainBrigand의 솔루션은 새로운 문제가 발생할 때까지 한동안 꽤 잘 작동했습니다. ContentEditables는 고통스럽고 React를 다루기가 정말 쉽지 않습니다 ...
이 JSFiddle 은 문제를 보여줍니다.
보시다시피 일부 문자를 입력하고을 클릭 Clear
하면 내용이 지워지지 않습니다. 이는 contenteditable을 마지막으로 알려진 가상 DOM 값으로 재설정하려고하기 때문입니다.
따라서 다음과 같이 보입니다.
shouldComponentUpdate
캐럿 위치 점프를 방지 해야 합니다.
shouldComponentUpdate
이런 식으로 사용하면 React의 VDOM diffing 알고리즘에 의존 할 수 없습니다 .
따라서 shouldComponentUpdate
예를 반환 할 때마다 DOM 콘텐츠가 실제로 업데이트되었는지 확인할 수 있도록 추가 줄이 필요합니다 .
따라서 여기 버전은 a를 추가하고 다음 componentDidUpdate
과 같이됩니다.
var ContentEditable = React.createClass({
render: function(){
return <div id="contenteditable"
onInput={this.emitChange}
onBlur={this.emitChange}
contentEditable
dangerouslySetInnerHTML={{__html: this.props.html}}></div>;
},
shouldComponentUpdate: function(nextProps){
return nextProps.html !== this.getDOMNode().innerHTML;
},
componentDidUpdate: function() {
if ( this.props.html !== this.getDOMNode().innerHTML ) {
this.getDOMNode().innerHTML = this.props.html;
}
},
emitChange: function(){
var html = this.getDOMNode().innerHTML;
if (this.props.onChange && html !== this.lastHtml) {
this.props.onChange({
target: {
value: html
}
});
}
this.lastHtml = html;
}
});
Virtual dom은 구식으로 유지되며 가장 효율적인 코드는 아니지만 적어도 작동합니다. :) 내 버그가 해결되었습니다.
세부:
1) 캐럿 점프를 피하기 위해 shouldComponentUpdate를 넣으면 contenteditable이 다시 렌더링되지 않습니다 (적어도 키 입력시)
2) 구성 요소가 키 입력시 다시 렌더링되지 않으면 React는이 콘텐츠에 대한 오래된 가상 돔을 편집 가능하게 유지합니다.
3) React가 가상 DOM 트리에서 오래된 버전의 contenteditable을 유지하는 경우 가상 DOM에서 오래된 값으로 contenteditable을 재설정하려고하면 가상 DOM diff 중에 React는 변경 사항이 없다고 계산합니다. DOM에 적용하십시오!
이것은 주로 다음과 같은 경우에 발생합니다.
- 처음에 비어있는 contenteditable이 있습니다 (반드시 ComponentUpdate = true, prop = "", previous vdom = N / A),
- 사용자가 일부 텍스트를 입력하고 렌더링을 방지합니다 (shouldComponentUpdate = false, prop = text, previous vdom = "").
- 사용자가 유효성 검사 버튼을 클릭 한 후 해당 필드를 비워야합니다 (shouldComponentUpdate = false, prop = "", previous vdom = "").
- 새로 생성 된 vdom과 기존 vdom이 모두 ""이므로 React는 dom을 건드리지 않습니다.
initialValue
로state
하고 그것을 사용render
,하지만 난 더 업데이 트를이 반응하지 않습니다.