Vue项目6:使用Router

本博客在 Vue项目5 的基础上进行。

 

Router为路由,路由允许我们通过不同的 URL 访问不同的内容。

项目目录结构:

 

1.安装router

cnpm install vue-router -g

2.启动项目

npm run dev

3.使用vue-router

 修改main.js

1)使用vue-router,导入Users和Test页面组件

import VueRouter from 'vue-router'
import Users from './components/Users'
import Test from './components/Test'


Vue.use(VueRouter)

 2)定义路由:‘/’渲染Users组件,‘/test’渲染Test组件 

const routes = [
{path:'/', component: Users},
{path: '/test', component: Test}
]

3)新建VueRouter对象

const router = new VueRouter({
mode: 'history',
base: __dirname,
routes: routes //注意:routes的拼写,不要错写成routers
});

4)创建vue对象和挂载根实例

new Vue({
router,
template: `
<div id="app">
<ul>
<li><router-link to="/">Users</router-link></li>
<li><router-link to="/test">Test</router-link></li>
</ul>
<router-view></router-view>
</div>
`,
}).$mount('#app')

浏览器输出如下:

点击Test链接,地址栏变为localhost:8080/test,页面内容也变成了Test组件的内容,截图如下:

 

 

最后附上main.js、App.vue、Users.vue和Test.vue的完整代码:

 

main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import VueRouter from 'vue-router'
import vueResource from 'vue-resource'
import App from './App'
import Users from './components/Users'
import Test from './components/Test'


Vue.config.productionTip = false
Vue.use(vueResource)
Vue.use(VueRouter)

const routes = [
  {path:'/', component: Users},
  {path: '/test', component: Test}
]

const router = new VueRouter({
  mode: 'history',
  base: __dirname,
  routes: routes //注意:routes的拼写,不要错写成routers
});

/* eslint-disable no-new */
new Vue({
  // el: '#app',
  // components: { App },
  // template: '<App/>'
  router,
  template: `
    <div id="app">
      <ul>
        <li><router-link to="/">Users</router-link></li>
        <li><router-link to="/test">Test</router-link></li>
      </ul>
      <router-view></router-view>
    </div>
  `,
}).$mount('#app')

 

App.vue 

<template>
  <div id="app">
    <!-- <test msg="Hello"></test> -->
    <users></users>
  </div>
</template>

<script>
import Test from './components/Test'
import Users from './components/Users'

export default {
  name: 'App',
  components: {
    Test, Users
  }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

 

Users.vue

<template>
    <div class="users">
        <h1>Users</h1>
        <!-- 通过输入框添加用户 -->
        <form v-on:submit="addUser">
            <input type="text" v-model="newUser.name" placeholder="Enter Name">
            <br>
            <input type="text" v-model="newUser.email" placeholder="Enter Email">
            <br>
            <input type="submit" value="Submit">
        </form>
        <ul>
            <li v-for='user in users'>
                <input type="checkbox" class="toggle" v-model="user.contacted">
                <span :class="{contacted: user.contacted}">
                    {{user.name}}:{{user.email}} <button v-on:click="deleteUser(user)">x</button>
                </span>
                
            </li>
        </ul>
        <div>
            <input type="button" @click="get()" value="点我异步获取数据(Get)">
        </div>
    </div>
</template>

<script>

export default {
    name: 'users',
    data(){
        return {
            newUser:{},
            users: []
        }
    },
    methods:{
        addUser: function(e){
            console.log('add User');//控制台打印输出log
            //将输入的内容添加到用户users中
            this.users.push({
                name: this.newUser.name,
                email: this.newUser.email,
                contacted: false
            });
            e.preventDefault();//添加这句才看到console有输出
        },
        deleteUser: function(user){
            this.users.splice(this.users.indexOf(user),1);//删除用户,indexOf为删除哪个用户,1为删除1条数据
        },
         get:function(){
            //发送get请求
            this.$http.get('https://jsonplaceholder.typicode.com/users').then(function(res){
                this.users=res.data; 
                console.log(res.data);   
            },function(){
                console.log('请求失败处理');
            });
         }

    }

}
</script>

<style scoped>
    .contacted{
        text-decoration: line-through;
    }
</style>


 

Test.vue

<template>
    <div class="test">
        <input type="text" v-model="title"><br />
        <h1>{{title}}</h1>
        <span v-html="title1"></span>
        <p v-if="showName">{{user.firstName}}</p>
        <p v-else>Nobody</p>
        <p v-text="user.firstName"></p>
        <ul>
            <li v-for="item in items">{{item.title}}</li>
        </ul>
        <button v-on:click="greet('Hello World11')">Say Greeting</button>
        <br>
        <input type="text" v-on:keyup="preesKey" v-on:keyup.enter="enterHit">
        <hr>
        <label>firstName</label><input type="text" v-model="user.firstName">
        <br>
        <label>lastName</label><input type="text" v-model="user.lastName">
        <br>
        <h3>{{fullName}}</h3>
        <h2>{{msg}}</h2>
    </div>
</template>

<script>

export default {
    name: 'test',
    props: {
        msg:{
            type: String,
            default: 'Foolbar'
        }
    },
    data(){
        return {
            title: 'Hello world',
            title1:'<h1>Html title</h1>',
            user:{
                firstName:'John',
                lastName:'Doe'
            },
            showName: true,
            items: [
                {title: 'Item One'},
                {title: 'Item Two'},
                {title: 'Item three'}

            ]
        }
    },
    methods:{
        greet: function(greeting){
            alert(greeting);
        },
        preesKey: function(e){
            console.log(e.target.value);
        },
        enterHit: function(){
            console.log('You hit enter');
        }
    },
    computed: {
        fullName: function(){
            return this.user.firstName + ' ' + this.user.lastName;
        }
    }
}
</script>

<style scoped>

</style>

 

 

 

完成! enjoy it!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值