Thank you Kent! On Sat, 20 Jan 2024, 12:31 Ernesto Reinaldo Barreiro, <reier...@gmail.com> wrote:
> Thanks for sharing! > > On Sat, Jan 20, 2024 at 12:49 AM Kent Tong <kent.tong...@gmail.com> wrote: > > > Hi, > > > > I have written a simple Wicket component that allows you to easily > render a > > Vue 3 app in Java. This component is implemented in about just 130 lines > of > > code (including Java, HTML and js), so there is no risk in using it. > > <https://github.com/freemant2000/WicketVueApp#how-to-use>How to use > > > > Suppose that you want a Vue app on an HTML page like below: > > > > <script src="https://.../vue.js"></script> > > <div id="app1"></div> > > <script> > > var app = Vue.createApp({ > > data() { > > return {a: 4, b: "Hi"}; > > }, > > template: `<span @click='m1()'>{{a}} {{b}}<span>`, > > methods { > > m1() { > > console.log(this.a); > > } > > }, > > }); > > app.mount('#app1') > > </script> > > > > And you want to generate this from a Wicket page. To do that, you can use > > the WicketVueApp component provided by this project. > > > > First, add the dependency: > > > > <dependency> > > <groupId>com.ttdev</groupId> > > <artifactId>wicket-vue-app-core</artifactId> > > <version>1.0.2</version> > > </dependency> > > > > Your Wicket page should be like: > > > > import com.ttdev.WicketVueApp; > > public class GetStartedDemo extends WebPage { > > public GetStartedDemo() { > > HashMap<String, Object> state = new HashMap<>(); > > state.put("a", 4); > > state.put("b", "Hi"); > > WicketVueApp vwa=new WicketVueApp("wva", > > new Model(state), > > "m1() {console.log(this.a);}"); > > add(vwa); > > } > > } > > > > The template is provided in the HTML markup: > > > > <html><body><div wicket:id="wva"> > > <span @click='m1()'>{{a}} {{b}}<span></div></body></html> > > > > The WicketVueApp component will generate the desired HTML and js code > > inside the <div> automatically. Now, run your Wicket webapp as usual and > > you will see the Vue app working on your Wicket page. > > Handling Vue events in Wicket > > > > In the example above, suppose that you want to handle the click on the > > server side (Wicket), all you need to do is to call a js method named > "cb" > > (standing for "call back") as shown below: > > > > <html><body><div wicket:id="wva"> > > <span @click='cb()'>{{a}} {{b}}<span></div></body></html> > > > > This cb method will use Wicket's ajax mechanism to send the request to > the > > Wicket side, where you can handle it by overriding the OnVueEvent method: > > > > public class GetStartedDemo extends WebPage { > > public GetStartedDemo() { > > HashMap<String, Object> state = new HashMap<>(); > > state.put("a", 4); > > state.put("b", "Hi"); > > WicketVueApp vwa=new WicketVueApp("wva", > > new Model(state)) { > > @Override > > public void onVueEvent(AjaxRequestTarget target, Map<String, > > Object> data) { > > state.put("b", state.get("b")+"!"); > > } > > }; > > add(vwa); > > } > > } > > > > The cb method will automatically send the current state of the Vue app > back > > to the WicketVueApp component on server, which will use the data to > update > > itself own state, before calling its onVueEvent method. This way you will > > have access to the latest state of the Vue app in the browser. > > > > In this method you can further modify the state, which will be sent back > to > > the browser automatically to refresh the Vue app. Here, in this example, > > the "b" variable's value will have an exclamation mark added to it. > > > > Note that the AjaxRequestTarget one of the parameters, you can add other > > ajax Wicket components to the target to have them refreshed. > > < > > > https://github.com/freemant2000/WicketVueApp#handling-vue-events-in-wicket > > > > > > > -- > > Kent Tong > > IT author and consultant, child education coach > > > > > -- > Regards - Ernesto Reinaldo Barreiro >