-
How to convert below web component into Leptos component? It creates resizable div when user adjusts it. My web component version of this link https://phuoc.ng/collection/html-dom/create-resizable-split-views/ class MyResizer extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
this.style.cursor = "ew-resize"
this.style.maxWidth = "2px"
this.style.height = "inherit"
this.style.border = "2px solid red"
this.addEventListener('mousedown', this.on_mousedown);
}
disconnectedCallback() {
this.removeEventListener('mousedown', this.on_mousedown);
}
on_mousedown(e){
// Elements
const leftSide = this.previousElementSibling;
const rightSide = this.nextElementSibling;
// Get the current mouse position
let x = e.clientX;
let y = e.clientY;
let leftWidth = leftSide.getBoundingClientRect().width;
const on_mousemove = function (e) {
// How far the mouse has been moved
const dx = e.clientX - x;
leftSide.style.width = leftWidth + dx;
leftSide.style.pointerEvents = 'none';
rightSide.style.pointerEvents = 'none';
document.body.style.cursor = 'ew-resize';
document.body.style.userSelect = 'none';
};
const on_mouseup = function () {
document.removeEventListener('mousemove', on_mousemove);
leftSide.style.removeProperty('pointer-events');
rightSide.style.removeProperty('pointer-events');
document.body.style.removeProperty('cursor');
document.body.style.removeProperty('user-select');
document.removeEventListener('mouseup', on_mouseup);
};
document.addEventListener('mousemove', on_mousemove);
document.addEventListener('mouseup', on_mouseup);
}
}
customElements.define('my-resizer', MyResizer); My Attempt for converting above code into leptos but it is not working as expected. #[component]
fn Resizer() -> impl IntoView {
let mouse_down = move |e: MouseEvent| {
let x = e.client_x();
log!("{}", x);
let mouse_move = window_event_listener(ev::mousemove, move |e| {
let dx = e.client_x() - x;
log!("dx:{}", dx);
let target = e.target().unwrap();
let div: HtmlDivElement = target.dyn_into().unwrap();
let left_side = div.previous_element_sibling().unwrap();
let right_side = div.next_element_sibling().unwrap();
let left_width = left_side.client_width() + dx;
let global = document().body().unwrap();
global
.set_attribute("style", "cursor:ew-resize; user-select: none;")
.unwrap();
left_side
.set_attribute(
"style",
&format!("pointer-events: none; width: {}px", left_width),
)
.unwrap();
right_side
.set_attribute("style", "pointer-events: none;")
.unwrap();
});
on_cleanup(move || mouse_move.remove());
let mouse_up = window_event_listener(ev::mouseup, move |e| {
// How to ?
// mouse_move.remove();
let target = e.target().unwrap();
let div: HtmlDivElement = target.dyn_into().unwrap();
let left_side = div.previous_element_sibling().unwrap();
let right_side = div.next_element_sibling().unwrap();
let global = document().body().unwrap();
global
.set_attribute("style", "cursor:auto; user-select: auto")
.unwrap();
left_side
.set_attribute("style", "pointer-events: auto;")
.unwrap();
right_side
.set_attribute("style", "pointer-events: auto;")
.unwrap();
});
on_cleanup(move || mouse_up.remove());
};
view! {
<div style="cursor: ew-resize; max-width: 2px; height: inherit; border: 2px solid red;" on:mousedown=mouse_down></div>
}
} Thanks |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 7 replies
-
Without having read the post in detail, I will say "try |
Beta Was this translation helpful? Give feedback.
-
Additional Info <div class="container">
<div class="sidebar"></div>
<my-resizer></my-resizer>
<div class="main"></div>
</div> Thank you. |
Beta Was this translation helpful? Give feedback.
Right you're trying to mutate a variable (
handle_ownership
) that's not declared mutable. If you addmut
it will also be sad because now you're mutating a captured variable in anFn
closure. We should probably allowFnMut
on event listeners like that in the future but in any case adding aRefCell
here works fine: