niklas
¿Cómo puedo desplazar un bloque recién insertado a la vista en el editor de wordpress gutenberg?
Estoy creando el bloque con
const nextBlock = createBlock( 'core/paragraph' );
wp.data.dispatch( 'core/editor' ).insertBlock( nextBlock );
//scroll the block into the view
También he visto que gutenberg usa el dom-scroll-into-view
paquete como por ejemplo aquí.
Su documentación dice:
var scrollIntoView = require('dom-scroll-into-view');
scrollIntoView(source,container,config);
pero, ¿cómo puedo hacer que funcione en mi caso, cómo obtener los elementos DOM de origen y contenedor?
Sally C.J.
en mi caso, ¿cómo obtener los elementos DOM fuente y contenedor?
En realidad es bastante fácil… solo usa document.querySelector()
para obtener el nodo de bloque y luego wp.dom.getScrollContainer()
para obtener el contenedor de ese nodo:
const nextBlock = wp.blocks.createBlock( 'core/paragraph' );
wp.data.dispatch( 'core/editor' ).insertBlock( nextBlock );
const source = document.querySelector( '[data-block="' + nextBlock.clientId + '"]' );
const container = wp.dom.getScrollContainer( source );
Y aquí está mi código:
/**
* External dependencies
*/
import scrollIntoView from 'dom-scroll-into-view';
/**
* WordPress dependencies
*/
import { createBlock } from '@wordpress/blocks'; // wp.blocks.createBlock
import { dispatch } from '@wordpress/data'; // wp.data.dispatch
import { getScrollContainer } from '@wordpress/dom'; // wp.dom.getScrollContainer
function getBlockDOMNode( clientId ) {
return document.querySelector( '[data-block="' + clientId + '"]' );
}
const nextBlock = createBlock( 'core/paragraph' );
dispatch( 'core/editor' ).insertBlock( nextBlock );
const source = getBlockDOMNode( nextBlock.clientId );
const container = source ? getScrollContainer( source ) : null;
if ( source && container ) {
scrollIntoView( source, container );
}
ACTUALIZAR
Para probar el import
educar scrollIntoView()
prueba esto:
function scrollBlockIntoView( block ) {
const source = getBlockDOMNode( block.clientId );
const container = source ? getScrollContainer( source ) : null;
if ( source && container ) {
console.log( source, container );
scrollIntoView( source, container );
}
}
window.scrollBlockIntoView = function( block ) {
scrollBlockIntoView( block || {} );
};
Y luego desde la consola del navegador, ejecute esto:
scrollBlockIntoView( wp.data.select('core/editor').getBlocks()[1] )
Pero asegúrese de tener al menos dos bloques en el editor, por ejemplo, un párrafo con un contenido extenso y un bloque de imagen.
Probado y probado trabajando en Chrome (Windows 10).
-
¿Te funciona? La fuente y el contenedor son válidos y parecen ser los elementos correctos, pero no se desplaza.
– Nicolás
27 de junio de 2019 a las 12:58
-
Su solución solo funciona en safari, pero creo que la respuesta es completa, correcta y cercana a lo que necesitaba. Supongo que es un
dom-scroll-into-view
¿tema? ¿O podríamos estar usándolo mal?– Nicolás
27 de junio de 2019 a las 13:02
-
Así que estoy en WordPress 5.2.2. Y en realidad, el
insertBlock()
call en realidad desplaza automáticamente el bloque insertado a la vista, sin tener que llamarscrollIntoView()
. y si, elscrollIntoView()
en mi código funciona correctamente.– Sally C.J.
27 de junio de 2019 a las 14:16
dom-scroll-into-view
es un paquete NPM en sí mismo en https://github.com/yiminghe/dom-scroll-into-view
Tienen una demo disponible en http://yiminghe.me/dom-scroll-into-view/examples/demo.html
Y su código fuente principal es https://github.com/yiminghe/dom-scroll-into-view/blob/master/src/dom-scroll-into-view.js
Respuesta corta:
-
source
es el elemento HTML que desea mostrar. -
container
es su elemento contenedor, o simplemente puede ponerlo para que seawindow
si no tiene un contenedor particular que envuelva su elemento. -
Finalmente
config
es un objeto opcional que le permite configurar algunos ajustes finos como un poco de margen en la parte superior izquierda si no desea que esto toque el borde superior exacto del navegador. Puedes empezar pasando{}
a eso por ahora.
-
Lo sé, pero no puedo imaginarme ese uso concreto en el caso de Gutenberg.
– Nicolás
23 de junio de 2019 a las 0:53
-
@niklas
scrollIntoView
necesita elementos DOM ya que es una acción DOM pura. Y React no recomienda acceder a elementos DOM explícitamente. La única solución es usarref
que es exactamente lo que el último tipo que agregóscrollIntoView
a gutenberg ha hecho. Aquí está el PR que puedes seguir: github.com/WordPress/gutenberg/commit/… . Básicamente, solo agregue una referencia a sus bloques creados, luego obtenga DOM usando esa referencia y pásela a scrollIntoView.– Ayuda en
24 de junio de 2019 a las 1:37
-
y ¿cómo agregar referencias al “contenedor del editor de bloques”?
– Nicolás
24 de junio de 2019 a las 9:26
-
@niklas, es posible que puedas dejarlo así
window
y ver cómo funciona. De lo contrario, puedes seguirthis.inserterResults
en el PR que compartí.– Ayuda en
24 de junio de 2019 a las 21:57
Me pregunto si podrías usar
const blockNode = getBlockDOMNode( blockId )
yconst scrollContainer = getScrollContainer( blockNode )
como en MultiSelectScrollIntoView. tal vez comoscrollIntoView( blockNode, scrollContainer, { onlyScrollIfNeeded: true, } );
. ¿Tenemos el ID de bloque denextBlock.id
o con el'block-'
prefijo?– birgire
22 de junio de 2019 a las 15:35
¿Puedes crear un JSFiddle para esto para que podamos reproducir tu problema?
– Lajos Arpad
23 de junio de 2019 a las 13:07
Bueno, supongo que no. Es la instalación predeterminada de wordpress con muchos archivos js y css específicos de wordpress. Para reproducir, uno tendría que configurar un entorno de wordpress con wordpress> 5.0 … pero tal vez encuentre un patio de juegos de wordpress en línea en algún lugar.
– Nicolás
23 de junio de 2019 a las 13:29