⚠️ This is a legacy version of the Vue 3 tutorial. Please visit docs.meteor.com/tutorials/vue/meteorjs3-vue3-vue-meteor-tracker for the current version.

1: Creating the app

1.1: Install Meteor

First we need to install Meteor.

Install the latest official Meteor release following the steps in our docs.

1.2: Create Meteor Project

The easiest way to setup Meteor with Vue is by using the command meteor create with the option --vue and your project name:

meteor create --vue simple-todos-vue

Meteor will create all the necessary files for you.

The files located in the client directory are setting up your client side (web), you can see for example client/main.js where Meteor is rendering your App main component into the HTML.

Also, check the server directory where Meteor is setting up the server side (Node.js), you can see the server/main.js is initializing your MongoDB database with some data. You don’t need to install MongoDB as Meteor provides an embedded version of it ready for you to use.

You can now run your Meteor app using:

meteor run

Don’t worry, Meteor will keep your app in sync with all your changes from now on.

Your Vue code will be located inside the imports/ui directory, and App.vue file is the root component of your Vue To-Do app.

Take a quick look in all the files created by Meteor, you don’t need to understand them now, but it’s good to know where they are.

1.3: Install prettier and eslint

Vue do not have native support on vscode for example. To configure Vue on your favorite IDE you’ll need to install and configure prettier and eslint. Theses tools will help you to keep your code clean and organized by formatting your code and showing you some errors and warnings based on your configuration. Eslint will identify problematic patterns and prettier will format your code.

To install prettier and eslint, run:

meteor npm install --save-dev prettier eslint eslint-plugin-vue eslint-config-prettier eslint-plugin-prettier

Now, create a file called .eslintrc.js and paste the code bellow.

.eslintrc.js

module.exports = {
  root: true,
  env: {
    browser: true,
    node: true,
  },
  parserOptions: {
    ecmaVersion: 8,
  },
  extends: ['eslint:recommended', 'plugin:vue/vue3-recommended', 'prettier'],
  plugins: ['prettier'],
  rules: {
    'prettier/prettier': ['error'],
    'vue/require-default-prop': 0,
    'vue/html-indent': ['error', 2],
    'vue/singleline-html-element-content-newline': 0,
    'vue/component-name-in-template-casing': ['error', 'PascalCase'],
    'vue/multi-word-component-names': 0,
  },
  globals: {
    _: true,
  },
}

And also create a file called .prettierrc and paste the code bellow.

.prettierrc

{
  "semi": true,
  "singleQuote": true,
  "tabWidth": 2,
  "printWidth": 80
}

If you use vscode, you will need to install the extensions for prettier and eslint. And then, restart the window.

1.4: Clean UI folder

Let’s delete some files that we don’t need for now. Open your imports/ui folder and remove:

  • About.vue
  • AppMenu.vue
  • Hello.vue
  • Home.vue
  • Info.vue

It means that you’ll keep only App.vue, main.js and router.js inside ui folder.

Now that we removed some components, we need to fix our router.js file:

imports/ui/router.js

import { createRouter, createWebHistory } from 'vue-router'
import App from './App.vue'

export const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/',
      name: 'home',
      component: App,
    },
  ],
})

At this file we can create some routes and define the component that each route should render.

Also, we need to fix the App component, because we’re importing a component that does not exist more.

imports/ui/App.vue

<template>
  <div class="p-8">
    <h1>Hello Meteor</h1>
  </div>
</template>

1.5: Create Task Component

We will store all our Vue components inside the ui/components folder. So, let’s create this folder and create a file called Task.vue inside it.

This file will export a Vue component called Task that will represent one task in your To-Do list.

imports/ui/components/Task.vue

<script setup>
defineProps({
  task: {
    type: Object,
    required: true,
  },
});
</script>

<template>
  <li>{{ task.text }}</li>
</template>

As this component will be inside a list you are returning a li element.

1.6: Create Sample Tasks

As you are not connecting to your server and your database yet let’s define some sample data which will be used shortly to render a list of tasks. It will be an array, and you can create a function to return this array.

imports/ui/App.vue

<script setup>
import Task from './components/Task.vue'

const getTasks = () => {
  return [
    { _id: 1, text: 'This is task 1' },
    { _id: 2, text: 'This is task 2' },
    { _id: 3, text: 'This is task 3' },
  ]
}
</script>

You can put anything as your text property on each task. Be creative!

1.7: Render Sample Tasks

Now we can implement some simple rendering logic with Vue. We can now use our previous Task component to render our list items.

See below how we change the template part of the App component to add a

imports/ui/App.vue

<template>
  <div class="container">
    <header>
      <h1 class="text-4xl font-bold text-gray-800 my-4">Todo List</h1>
    </header>
    <ul class="list-disc list-inside p-4">
      <Task v-for="task in getTasks()" :key="task._id" :task="task" />
    </ul>
  </div>
</template>

You can read more about Vue iterations here.

1.8 Mobile look

Let’s see how your app is looking on Mobile. You can simulate a mobile environment right clicking your app in the browser (we are assuming you are using Google Chrome as it is the most popular browser today) and then inspect, this will open a new window inside your browser called Dev Tools. In the Dev Tools you have a small icon showing a Mobile device and a Tablet, see where this icon is:

Click on it and then select the phone that you want to simulate and in the top bar.

You can also check your app in your cellphone, you can connect to your App using your local IP in the navigation browser of your mobile browser.

This command should print your local IP for you on Unix systems at least ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}'

You are going to see something like this:

Review: you can check how your code should be in the end of this step here

In the next step we are going to work with MongoDB database to store our tasks.

Edit on GitHub
// search box