Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

explain vue-router component as a function

I have seen in several different places the following type of route definition:

{   path : '/dashboard',
    component: { render (c) { return c('router-view') }},
    children:[{
            path:"",
            component: Dashboard
        }]
},    

I am trying to understand how this is different then

{   path : '/dashboard',
    component: Dashboard
},    

I think it is related to the optional addition of child routs (e.g. /dashboard/user) so that and the children array here just explains that the Dashboard component renders the path /dashboard whereas if I had the second piece of code then it can only render /dashboard.

What I do want to know is what exactly this does

    component: { render (c) { return c('router-view') }},

I assume this is some form of a degenerated component but I don't understand what exactly does it do and how.

like image 440
epeleg Avatar asked May 02 '18 13:05

epeleg


People also ask

What is vue router and how to use it?

One of the most powerful features of modern single-page web applications (SPA) is routing. Modern single-page apps such as a Vue application can transition from page to page on the client-side (without requesting the server). Vue Router is the official library for page navigation in Vue applications. Vue Router is simple to use, yet powerful.

What is a Vue component?

When not using a build step, a Vue component can be defined as a plain JavaScript object containing Vue-specific options: The template is inlined as a JavaScript string here, which Vue will compile on the fly.

Why should I use Vue instead of HTML?

It's common for an app to be organized into a tree of nested components: This is very similar to how we nest native HTML elements, but Vue implements its own component model that allow us to encapsulate custom content and logic in each component. Vue also plays nicely with native Web Components.

Why is the value of is prefixed with Vue?

When used on native HTML elements, the value of is must be prefixed with vue: in order to be interpreted as a Vue component. This is required to avoid confusion with native customized built-in elements. That's all you need to know about DOM template parsing caveats for now - and actually, the end of Vue's Essentials.


1 Answers

In Vue, a component is created using an object containing its configuration.

The simplest possible component may look something like this

componentConfig = {
    template: '<div>test</div>'
};    
Vue.component('test', componentConfig);

In some cases, a developer might not want to use template, and would want to create element from scratch using pure Javascript. That's where render function comes in.

Vue recommends using templates to build your HTML in the vast majority of cases. There are situations however, where you really need the full programmatic power of JavaScript. That’s where you can use the render function, a closer-to-the-compiler alternative to templates.

from https://v2.vuejs.org/v2/guide/render-function.html#Basics

To change the example above to using render function:

componentConfig = {
    render: function(createElement) {
        return createElement('div', 'test')
    }
};
Vue.component('test', componentConfig);

They would produce the exact same result:

  • https://codepen.io/jacobgoh101/pen/ZoKwKb?editors=1010
  • https://codepen.io/jacobgoh101/pen/PemVmy?editors=1010

In other words, render function is simply an alternative to using template.

{
    component: {
        render(c) {
            return c('router-view')
        }
    }
}

is equal to

{
    component: {
        render(createElement) {
            return createElement('router-view')
        }
    }
}

is equal to

{
    component: {
        template: `<router-view></router-view>`
    }
}

Because render function is closer-to-the-compiler, it's faster compared to using template. That's probably why the author of your code does it this way.

like image 166
Jacob Goh Avatar answered Oct 18 '22 19:10

Jacob Goh