Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a 'Container' component in Vue.js

I'm new to Vue and cannot find a way to implement a React-like 'Wrapper' component with Vue.js, for example, a reusable datagrid component using a 3rd-party some-table component and a pagination component. Intuitively, datagrid will provide the data/props/events that both components need and control the communication between them. In React, this could be done as simply as something like

// inside <Datagrid />
<Table {...someProps} />
<Pagination {...otherProps} />

With Vue, It seems like something like below can only pass props down to children components

// inside Datagrid.vue
<some-table v-bind="$props"></some-table>

I'm not sure if slots could be of help. This wrapper component that I've been struggling for takes all the props/events/slots its children need and pass them down to them so that I could utilize all the functionality that it's children(which probably some 3rd-party components) provide. Moreover, it may also take responsibility for something like data exchange between its children. While datagrid could be a slots wrapper, but what if both table and pagination require a same data prop which I think should reside in datagrid. How to pass this data down to the slots?

// Datagrid.vue
<template>
  <div>
    <slot name="table"></slot>
    <slot name="pagination"></slot>
  </div>
</template>

<script>
export default {
  name: 'Datagrid',
  data() {
    return {
      data: 'How to share it with table and pagination',
    }
  },
}
</script> 

Some solutions that I could figure out:

  1. Render Functions, but I don't think that complicity is needed in this case
  2. Instead of creating a 'Container' component, simply turn to mixins, but does this mean I have to input <pagination :total="total" :other-props="are-same-for-all-datagrids"></pagination> each time I want a datagrid?

Any examples dealing with such situations in Vue? Thanks in advance!

like image 747
mylostlenore Avatar asked May 26 '17 16:05

mylostlenore


People also ask

How do you make a component in Vue?

Open the file in your code editor. Create the component's template section by adding <template></template> to the top of the file. Create a <script></script> section below your template section. Inside the <script> tags, add a default exported object export default {} , which is your component object.

What is a container Vue JS?

Containers are the most basic layout element in CoreUI for Vue. js and are required when using our default grid system. Containers are used to contain, pad, and (sometimes) center the content within them. While containers can be nested, most layouts do not require a nested container.

What is container component?

Container components can be primarily referred to as the parent elements of other components in a React app. They serve as a bridge between the normal components that render the UI and the logic that makes the UI components interactive and dynamic. The most common function of a container component is to obtain data.

How do I create a component in Vue command line?

For creating a component in the Vue project, create a . vue file in the components folder and provide it the name of your choice. Now, in this newly created . vue file, you can write HTML, Javascript, and CSS in the <template>, <script>, and <style> tags respectively.


1 Answers

You want to use slots:

Vue.component('wrapper', { template: '#wrapper' })

new Vue({ el: '#app' })
<!-- wrapper template -->
<script type="text/x-template" id="wrapper">
  <div class="wrapper" style="background: beige; padding: 5px;">
    This is being wrapped: 
    <slot></slot>
  </div>
</script>

<div id="app">
  <wrapper>
    <div style="background: aliceblue;">I'm being wrapped!</div>
  </wrapper>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.3/vue.js"></script>
like image 88
thanksd Avatar answered Oct 23 '22 06:10

thanksd