在Vue.js应用程序中使用Ionic 4组件

原文:https://alligator.io/vuejs/vue-ionic/

 

js正以各种正确的理由受到欢迎,Vue和先进的Web应用程序的结合前景光明。Ionic是一个处于结合移动优先用户体验(mobile first UX)前沿的web框架,尽管它目前由Angular 5.x提供支持,但该团队的新Stencil编译器允许Vue.js使用与Ionic 4相同的web组件。

Ionic4目前处于alpha中,不应用于生产,但尽管如此,这是一个伟大的思想实验,并深入探讨了Stencil的优点以及Web组件对于与框架无关的UI组件的意义。

要开始,请使用Vue CLI创建一个新的Vue项目:

# 安装 Vue CLI
$ npm install vue-cli

# 创建一个新的 Vue 项目
$ vue init webpack-simple vue-ionic

# 进入刚创建的目录
$ cd vue-ionic

# 添加 vue-router 和 axios
$ npm install vue-router axios

# 运行 开发服务器
$ npm run dev

 

REST API

我们可以使用json-sever创建一个本地REST API,它允许我们轻松地从服务器获取(GET)或发布(POST)todos 到服务器 。如果尚未安装,请在计算机上全局安装:

$ npm install json-server -g

服务器可以启动并带一个JSON序列化数据库。在项目根目录中创建一个名为db.json的文件:

{
  "todos": [
    {
      "id": 1,
      "name": "Make awesome applications"
    },
    {
      "id": 2,
      "name": "Play squash"
    },
    {
      "id": 3,
      "name": "Deadlift"
    },
    {
      "id": 4,
      "name": "Squat"
    }
  ]
}

  

通过在终端中运行以下命令启动API:

$ json-server db.json --watch --port 3001

现在我们已经有了一个API并在运行,让我们添加 Ionic!

 

添加 Ionic

 要在项目中添加Ionic的alpha版本,请将以下脚本添加到index.html文件中:

<script src="https://unpkg.com/@ionic/core@0.0.2-30/dist/ionic.js"></script>

您可以在这里找到当前版本的Ionic core: https://www.npmjs.com/package/@Ionic/core

同时,确保您有适当的响应元标记:

<meta name="viewport" content="width=device-width, initial-scale=1.0">

  

路由

然后,我们可以设置两条允许查看todo项或添加todo项的路由:

 

import Vue from 'vue'
import VueRouter from 'vue-router';

import TodoList from './components/TodoList';
import AddTodoItem from './components/AddTodoItem';

Vue.use(VueRouter);

const routes = [
  { path: '', redirect: '/todos'},
  { path: '/todos', component: TodoList },
  { path: '/todos/add', component: AddTodoItem}
]

export default new VueRouter({ routes })

然后,将路由配置添加到main.js中的主Vue实例:

import Vue from 'vue'
import App from './App.vue'

import router from './router'

new Vue({
  el: '#app',
  router,
  render: h => h(App)
})

  

Ionic Web Component

由于Ionic4.x是使用Web Component构建的,我们需要告诉Vue, Ionic组件不是Vue组件。在main.js中,添加以下忽略所有Ionic元素的配置对象:

Vue.config.ignoredElements = [/^ion-/]

在App.vue内部,我们现在可以添加<router view>并将其包含在<ion App>组件中。这是用来包含我们所有的Ionic 组件:

<template>
  <ion-app>
    <router-view></router-view>
  </ion-app>
</template>

  

Todo List

要创建我们在router.js中注册的todo列表页,请在src/components文件夹中创建一个名为todo list.vue的文件。

在我们创建的钩子中,我们从API捕获todo并将它们分配给todos数组。

import axios from 'axios';

export default {
  data() {
    return {
      todos: []
    }
  },
  methods: {
    addTodo() {
      this.$router.push({path: '/todos/add'})
    }
  },
  created() {
    axios.get('http://localhost:3001/todos')
      .then(res => this.todos = res.data)
  }
}

  然后我们可以添加一个模板,这个模板看起来肯定与以前使用过Ionic的任何模板相似:

<template>
  <ion-page>
    <ion-header>

      <ion-toolbar class="toolbar-md-primary">
        <ion-title>TodoList</ion-title>
      </ion-toolbar>

    </ion-header>
    <ion-content class="content">

      <ion-list>
        <ion-item v-for="todo in todos" :key="todo.id">
          
        </ion-item>
      </ion-list>

      <ion-fab-button class="todo-fab" @click="addTodo">
        <ion-icon name="add"></ion-icon>
      </ion-fab-button>
    </ion-content>
  </ion-page>
</template>

  

我们将组件包装在一个ion-page元素中。这样我们就可以定义一个标题和工具栏,使我们能够显示一个导航栏。
接下来,我们可以在一个ion-content元素中显示列表,并将todos数组中的每个项作为一个ion-item进行迭代。
给我们的fab按钮加样式并添加一些内边距。我们将在两个组件中同时使用这两个类,因此我们添加一个style.css文件和适当的类:

.todo-fab {
  position: fixed;
  bottom: 25px;
  right: 15px;
  font-size: 30px;
}

.content {
  padding: 10px 10px 10px 0px
}

  

This gives us the following这给了我们以下结果 :

 

当用户单击FAB按钮时,它们将导航到Add Todo页面。让我们在components/AdddoItem创建它:

<template>
  <ion-page>
    <ion-header class="toolbar-md-primary">

      <ion-toolbar>
        <ion-title>Add Item</ion-title>
      </ion-toolbar>

    </ion-header>
    <ion-content class="content">

      <ion-item>
        <ion-input :value="name" ref="newTodoItem" @input="updateTodoName" placeholder="Todo Name"></ion-input>
      </ion-item>

      <ion-fab-button class="todo-fab" @click="addTodo">
        <ion-icon name="checkmark"></ion-icon>
      </ion-fab-button>

    </ion-content>
  </ion-page>
</template>

  

我们的标记看起来很相似,但这次我们使用的是ion-input。要获取新todo项的值,我们使用ref和input事件。

 

import axios from 'axios';

export default {
  data() {
    return {
      name: ''
    }
  },
  methods: {
    addTodo() {
      const newTodo = { name: this.name }
      axios.post('http://localhost:3001/todos', newTodo)
        .then(res => {
          this.$router.push({path: '/todos'})
        })
    },
    updateTodoName() {
      this.name = this.$refs.newTodoItem.value
    }
  }
}

  这个页面的代码也非常类似,每当有人点击Fab按钮时,我们使用AXIOS添加一个新的ToDo项目到API。

 

这是结果 :

 

原文发表日期: 一月 16, 2018

 

posted @ 2020-01-08 17:17  johnjackson  阅读(1235)  评论(0编辑  收藏  举报