Red de conocimientos turísticos - Conocimientos sobre calendario chino - ¿Por qué los navegadores no implementan DOM virtuales como reaccionar.js internamente?React se originó como un proyecto interno en Facebook porque la empresa no estaba satisfecha con todos los marcos JavaScript MVC en el mercado, por lo que decidió haz el tuyo propio Escribe un conjunto y úsalo para crear el sitio web de Instagram. Una vez completada la producción, descubrimos que el marco funcionaba bien, por lo que lo hicimos de código abierto en mayo de 2013. Debido a que el concepto de diseño de React es extremadamente único, es una innovación revolucionaria y tiene un rendimiento sobresaliente, pero la lógica del código es muy simple. Por lo tanto, cada vez más personas le prestan atención y lo utilizan, pensando que puede ser la herramienta principal para el desarrollo web en el futuro. Hace unos días escribí ese artículo de "arrastrar y soltar" y me quedé con preguntas. Esta vez, después de los consejos de blogueros entusiastas y de corregir algunos errores menores, se agregó una parte de detección de bordes de arrastrar y soltar. Hablemos de arrastrar y soltar: 1. No opere directamente elementos dom. El concepto de dom virtual se utiliza en la reacción. El propósito es evitar operar directamente elementos dom, por lo que debemos prestar atención al funcionamiento de los elementos dom. Solía ​​​​usar var directamente para obtener los parámetros del formulario. dragBox=document.getElementById('form') para encontrar el dom, pero de hecho, al grabar desde la posición inicial, se puede llamar a su componente secundario para actualizar los parámetros. del componente principal. Es decir, obtenido en el componente MyFrom, el código es el siguiente: onChildChanged:function(newState){ /*Las siguientes son modificaciones*/ var computedStyle=document.defaultView.getComputedStyle(ReactDOM.findDOMNode(this.refs.dragBox), null); newState.left =computedStyle(this.refs.dragBox),null); etc.left=computedStyle.left; newState.top=computedStyle.top /* Lo anterior está modificado **/ this.setState( newState) ; }, para que pueda realizar la operación directamente en el componente principal, no en el componente secundario. En segundo lugar, los eventos onmousemove y onmouseup deben estar vinculados a los eventos de arrastrar y soltar del documento, y cuando se presiona el mouse en DragArea, debe detectar qué tan lejos se ha movido el mouse en el documento y cuándo aparecerá. De lo contrario, si lo vincula directamente al formulario, habrá algo poco elegante, es decir, cuando la barra de arrastre se arrastra cerca del borde, si la velocidad del mouse es un poco más rápida que la barra de arrastre, el mouse se moverá automáticamente. Succionado después del fracaso. En la barra móvil. Por lo tanto, la función componenteDidMount se usa en la fase de inicialización de reacción. Esta función se llama después de cargar el componente. En otras palabras, después de llamar a este método, el componente se representa en la página y el DOM se puede modificar en este momento. . En otras palabras, en este momento, el evento correspondiente debe vincularse al documento. El código es el siguiente: componenteDidMount:function(){ document.addEventListener('mousemove',(e)=>{this.move(e). );}, false);/* Nueva característica de ES6, función de flecha, necesita depender de la herramienta de compilación jsx para ejecutarse correctamente * / document.addEventListener('mouseup',(e)=>{this.endDrag(e);} ,false); }, ¡Esto elimina ese pequeño error! En tercer lugar, agregue detección de bordes. Generalmente, no queremos arrastrar la ventana visible, por lo que necesitamos detectar bordes. Detecta la posición en cuatro direcciones: arriba, abajo, izquierda y derecha. Obviamente, la distancia entre la parte superior y la izquierda debe ser mayor o igual a 0, y la distancia entre la parte inferior y la derecha debe ser menor que el tamaño de la ventana gráfica menos el ancho y el alto del elemento en sí.

¿Por qué los navegadores no implementan DOM virtuales como reaccionar.js internamente?React se originó como un proyecto interno en Facebook porque la empresa no estaba satisfecha con todos los marcos JavaScript MVC en el mercado, por lo que decidió haz el tuyo propio Escribe un conjunto y úsalo para crear el sitio web de Instagram. Una vez completada la producción, descubrimos que el marco funcionaba bien, por lo que lo hicimos de código abierto en mayo de 2013. Debido a que el concepto de diseño de React es extremadamente único, es una innovación revolucionaria y tiene un rendimiento sobresaliente, pero la lógica del código es muy simple. Por lo tanto, cada vez más personas le prestan atención y lo utilizan, pensando que puede ser la herramienta principal para el desarrollo web en el futuro. Hace unos días escribí ese artículo de "arrastrar y soltar" y me quedé con preguntas. Esta vez, después de los consejos de blogueros entusiastas y de corregir algunos errores menores, se agregó una parte de detección de bordes de arrastrar y soltar. Hablemos de arrastrar y soltar: 1. No opere directamente elementos dom. El concepto de dom virtual se utiliza en la reacción. El propósito es evitar operar directamente elementos dom, por lo que debemos prestar atención al funcionamiento de los elementos dom. Solía ​​​​usar var directamente para obtener los parámetros del formulario. dragBox=document.getElementById('form') para encontrar el dom, pero de hecho, al grabar desde la posición inicial, se puede llamar a su componente secundario para actualizar los parámetros. del componente principal. Es decir, obtenido en el componente MyFrom, el código es el siguiente: onChildChanged:function(newState){ /*Las siguientes son modificaciones*/ var computedStyle=document.defaultView.getComputedStyle(ReactDOM.findDOMNode(this.refs.dragBox), null); newState.left =computedStyle(this.refs.dragBox),null); etc.left=computedStyle.left; newState.top=computedStyle.top /* Lo anterior está modificado **/ this.setState( newState) ; }, para que pueda realizar la operación directamente en el componente principal, no en el componente secundario. En segundo lugar, los eventos onmousemove y onmouseup deben estar vinculados a los eventos de arrastrar y soltar del documento, y cuando se presiona el mouse en DragArea, debe detectar qué tan lejos se ha movido el mouse en el documento y cuándo aparecerá. De lo contrario, si lo vincula directamente al formulario, habrá algo poco elegante, es decir, cuando la barra de arrastre se arrastra cerca del borde, si la velocidad del mouse es un poco más rápida que la barra de arrastre, el mouse se moverá automáticamente. Succionado después del fracaso. En la barra móvil. Por lo tanto, la función componenteDidMount se usa en la fase de inicialización de reacción. Esta función se llama después de cargar el componente. En otras palabras, después de llamar a este método, el componente se representa en la página y el DOM se puede modificar en este momento. . En otras palabras, en este momento, el evento correspondiente debe vincularse al documento. El código es el siguiente: componenteDidMount:function(){ document.addEventListener('mousemove',(e)=>{this.move(e). );}, false);/* Nueva característica de ES6, función de flecha, necesita depender de la herramienta de compilación jsx para ejecutarse correctamente * / document.addEventListener('mouseup',(e)=>{this.endDrag(e);} ,false); }, ¡Esto elimina ese pequeño error! En tercer lugar, agregue detección de bordes. Generalmente, no queremos arrastrar la ventana visible, por lo que necesitamos detectar bordes. Detecta la posición en cuatro direcciones: arriba, abajo, izquierda y derecha. Obviamente, la distancia entre la parte superior y la izquierda debe ser mayor o igual a 0, y la distancia entre la parte inferior y la derecha debe ser menor que el tamaño de la ventana gráfica menos el ancho y el alto del elemento en sí.

Código específico: move:function(event){ var e = evento? evento: window.event; var dBox=ReactDOM.findDOMNode(this.refs.dragBox) if (this.state.flag) { var nowX = e.clientX); , nowY = e.if (this.state.flag) { var nowX = e.clientX, nowY = e.clientY; var disX = nowX - this.state.currentX, disY = nowY - this.state.currentY /*; Agregar detección de rango de arrastre*/ var currentLeft=parseInt(this.state.left) + disX; var currentTop=parseInt(this.documentElement.clientHeightdocument.body.clientHeight; if(currentLeft<=250){//Detectar el lado izquierdo de la pantalla, porque mi centrado inicial aquí es utilizar un margen de menos la mitad del ancho del cuadro, así que use 250px para determinar el borde dBox.style.left=25"px" }else if(currentLeft>= ( docX-dBox.offsetWidth+250)){ //detecta el lado derecho dBox.style.left=(docX-this.state.offsetX)+" px"; px";
}else if(currentTop>=(docY-dBox.offsetHeight+200)){ //detectar borde inferior
dBox.style.top=(docY-this. state.offsetY)+" px ";
}else{
dBox.style.top = currentTop +"px";
}
}
}PD: El nuevo código se ha actualizado en mi github, verifíquelo afuera ! Los antecedentes y principios de ReactJS En el desarrollo web, siempre necesitamos reaccionar cambiando los datos a la interfaz de usuario en tiempo real y luego operar en el DOM. Las operaciones DOM complejas o frecuentes son a menudo la causa de cuellos de botella en el rendimiento (qué tan bien se realizan operaciones DOM complejas de alto rendimiento es a menudo un indicador importante de las habilidades de un desarrollador front-end). Cuando se desarrolla basado en React, toda la construcción de DOM se realiza a través de DOM virtual. Siempre que los datos cambien, React reconstruirá todo el árbol DOM y luego comparará el árbol DOM actual con el último árbol DOM y obtendrá la diferencia en DOM. estructura, y luego solo necesita realizar actualizaciones DOM reales en las partes modificadas del DOM del navegador.
>