vue组件&路由

默认全局普通组件

<div id="app">
    <addnum></addnum>
    <addnum></addnum>
</div>

<script>
    Vue.component("addnum",{
        template:'<div><input type="text" v-model="num"><button @click="num+=1">点击</button></div>',
        data: function(){
            // 写在这里的数据只有当前组件可以使用
            return {
                num:1,
            }
        }
    });


    var vm = new Vue({
        el:"#app",
        // 这里写的数据是全局公用的,整个文件共享
        data:{

        }
    })
</script>

Vue自动化工具(Vue-cli)

一般情况下,单文件组件,我们运行在 自动化工具vue-CLI中,可以帮我们把单文件组件编译成普通的js代码。所以我们需要在电脑先安装搭建vue-CLI工具。

官网:https://cli.vuejs.org/zh/

安装node.js,安装后自带npm包管理工具。

npm install -g 包名              # 安装模块   -g表示全局安装,如果没有-g,则表示在当前项目安装
npm list                        # 查看当前目录下已安装的node包
npm view 包名 engines            # 查看包所依赖的Node的版本 
npm outdated                    # 检查包是否已经过时,命令会列出所有已过时的包
npm update 包名                  # 更新node包
npm uninstall 包名               # 卸载node包
npm 命令 -h                      # 查看指定命令的帮助文档

安装Vue-cli

npm install -g vue-cli

如果安装速度过慢,一直超时,可以考虑切换npm镜像源:http://npm.taobao.org/

生成项目目录

// 生成一个基于 webpack 模板的新项目
vue init webpack 项目目录名
例如:
vue init webpack myproject

// 启动开发服务器 ctrl+c 停止服务
cd myproject
npm run dev           # 运行这个命令就可以启动node提供的测试http服务器

项目目录结构

src   主开发目录,要开发的单文件组件全部在这个目录下的components目录下
static 静态资源目录,所有的css,js,图片等资源文件放在这个文件夹
dist项目打包发布文件夹,最后要上线单文件项目文件都在这个文件夹中[后面打包项目,让项目中的vue组件经过编译变成js 代码以后,dist就出现了]
node_modules目录是node的依赖包目录
config是配置目录,
build是项目打包时依赖的目录
src/router   路由,后面需要我们在使用Router路由的时候,自己声明.

补充

node_modules目录
删了这个目录,本地测试开发的时候就无法启动项目了。
所以,将来我们在公司服务器里面会换一个web服务器来跑这个项目。
在本地的时候,为了方便开发,记得一定要保留这个目录。
如果这个目录被删除了,可以通过 npm install命令找回:`npm install`
vue,需要编译成js普通代码,所以需要build
搭建项目时,曾经有一个选项,询问是否安装vue-router
如果当时,我们选择yes,则vue会自动src下创建一个routes目录,这个目录就是提供给我们保存路由文件的。
在vue中导包时,如果文件后缀是js或者vue结尾的可以不用加后缀。

vue项目执行流程图

整个项目是一个主文件index.html,
index.html中会引入src文件夹中的main.js,
main.js中会导入顶级单文件组件App.vue,
App.vue中会通过组件嵌套或者路由来引用components文件夹中的其他单文件组件。

单文件组件的使用

# src\components内新建vue文件
# 该文件内的template 编写html代码
# 该文件内的script编写vue.js代码
# 该文件内的style编写当前组件的样式代码

普通组件的缺点:

1. html代码是作为js的字符串进行编写,所以组装和开发的时候不易理解,而且没有高亮效果。
2. 普通组件用在小项目中非常合适,但是复杂的大项目中,如果把更多的组件放在html文件中,那么维护成本就会变得非常昂贵。
3. 普通组件只是整合了js和html,但是css代码被剥离出去了。使用的时候的时候不好处理。
一个组件的内容显示在页面上需要3步操作
  • 组件嵌套类似的操作
# 导入	import Index from "./components/Index";
# 注册	components:{ Index }
# 调用	<Index></Index>

父组件给子组件传数据

# 子组件标签上使用绑定变量或者自定义属性传数据(动态数据和静态数据)
	<Index :pNum="pNum"></Index>
# 子组件内props内字符串的形式接受数据:props: ["pNum"]
# 然后就可以像data内的变量一样使用数据pNum

子组件给父组件传数据

# 子组件内定义一个监听属性, 监听需要传给父组件的那个变量,如:sNum
# 数据变化时触发执行this.$emit("getsNum", this.sNum);
# 父组件需要在子组件标签内自定义一个事件属性getsNum,对应的事件函数用于接收数据sNum
	<Index @getsNum="getsNum"></Index>
    methods:{
        getsNum(param1){		// param1形参就是接收的数据sNum
            this.sNum = params;
        },
    },   

在组件中使用axios获取数据

  • 本质上,使用的还是原来的axios,所以也会受到同源策略的影响。
  • 如果node_modules中没有需要使用的包,需要提前下载安装npm install axios
# 方式1:全局导入axios
# 在main.js中导入node_modules中的axios包
	import axios from 'axios'
# 在main.js中把axios对象 挂载到vue属性中多为一个子对象
	Vue.prototype.$axios = axios;
# 在子组件内使用
	this.$axios.get().then().catch()
    
# 方式2:局部组件内导入axios
# 导入
	import axios from 'axios'
# 使用
	axios.get().then().catch()

安装路由vue-router

# 下载安装路由组件
	npm i vue-router -S
	# npm install vue-router --save

配置路由

初始化路由对象
# 在src目录下创建router路由目录,
# 在router目录下创建index.js路由文件
# 在index.js路由文件中,编写初始化路由对象的代码
// 1. 引入vue和vue-router组件核心对象,
// 2. 在Vue中通过use注册vue-router组件
// 3. 暴露vue-router对象,并在vue-router里面编写路由,提供给main.js调用


# index.js
import Vue from "vue";
import Router from "vue-router";

Vue.use(Router);

export default new Router({
  mode: "history",		 // 设置路由模式为‘history’,去掉默认的#
  routes:[],			 // 路由列表
})

# 路由显示模式mode,默认hash,地址栏上面默认带#,history不会带#号
http://localhost:8080/#/home
http://localhost:8080/home
注册路由信息
# 打开main.js文件,导入并把router路由规则对象注册到vue中

import router from './router/index';	// 导入

new Vue({
  el: '#app',
  router,		// 注册
  components: { App },
  template: '<App/>'
});
在视图中显示路由对应的内容
# 在App.vue组件中,添加显示路由对应的内容。代码:
<template>
  <div id="app">
    <!-- 标签名必须是这个rouer-view -->
    <router-view></router-view>		
  </div>
</template>

注意:如果在vue创建项目的时候,设置安装vue-router,则项目会自动帮我们生成上面的router目录和index.js里面的代码,以及自动到main.js里面注册路由对象。

路由对象提供的操作

# 在我们安装注册了vue-router组件以后,
# vue-router在vue项目中会帮我们在全局范围内所有组件里面创建2个对象给我们使用

# this.$router	可用于在js代码中进行页面跳转。
# this.$route	可用于获取地址栏上面的url参数。

页面跳转

两种页面跳转方式:<router-link>this.$router.push()

router-link标签跳转

router-link标签,本质上就是a标签;

只是由vue-router进行加工处理可以显示局部页面刷新,不会重新加载内容,进行ajax跳转

# 在Home.vue组件中,使用router-link跳转到User.vue组件中。
# 导入组件
# 填写路由列表

# router/index.js

import Vue from "vue";
import Router from "vue-router"

Vue.use(Router);


// 1.导入组件
import Home from "../components/Home";
import User from "../components/User";

export default new Router({
  mode: "history",
  routes: [
    // 2. 填写路由列表
    {
        name: 'Home',		// 路由名称[对应组件的name值,将来用于跳转页面]",
        path : '/home',		// path: "访问url路径",
        component: Home,	// component: 组件名
    },
    {
        name: 'User',
        path: '/user',
        component: User
    },
  ],
})

Home.vue页面设置跳转标签

# 通过<router-link>标签实现页面跳转,
# 关键属性to相当于a标签的href。
# ajax, 页面不刷新

<template>
    <div>
      <h2>我是Home页面</h2>
      <a href="/user">点我a标签跳到User</a><br>
      <router-link to="/user">点我ajax不刷新跳转到User</router-link><br>
      <router-link :to="url">点我ajax不刷新跳转到User</router-link><br>
      <router-link :to="{name: 'User'}">点我ajax不刷新跳转到User</router-link><br>
      <router-link :to="{path: 'user'}">点我ajax不刷新跳转到User</router-link>
    </div>
</template>


data (){
    return {
        url : '/user',
    }
},

this.$router.push()跳转

Home.vue页面设置跳转标签(router/index.js不需要再设置)

<template>
    <div>
      <h2>我是Home页面</h2>
      <a href="/user">点我a标签跳到User</a><br>
      <hr>
      <button @click="jump">点我this.router.push跳转到User,页面不刷新</button>
    </div>
</template>

<script>
    export default {
        name: "Home",
        methods: {
          jump(){
            this.$router.push("/user");
          },
        },
    }
</script>


# 除此之外,还有其他几个页面跳转方法,大同小异
this.$router.back(); 		// 返回上一页,本质上就是 location.back()
this.$router.go(-1); 		// 返回上一页,本质上就是 location.go()
this.$router.forward(); 	// 跳转到下一页,本质上就是 location.forward()
this.$router.push("/user"); // 跳转到站内的制定地址页面中,本质上就是 location.href

# 注意,this.$router.push() 不能跳转到其他网站。
# 如果真的要跳转外站,则使用location.href="站外地址,记得加上http://协议"

传递参数

vue-router提供了this.$route,可以让我们接收来自其他页面的附带参数。参数有2种:查询字符串(query string)、路由参数(router params)

# 查询字符串,就是地址栏上面?号后面的参数,

    例如:http://localhost:8008/user?name=xiaoming&pwd=123,这里name=xiaoming&pwd=123就是查询字符串参数。

# 路由参数,就是地址栏上面路由路径的一部分,

    例如:`http://localhost:8080/user/300/xiaoming`,此时,300属于路由路径的一部分,这个300就是路由参数.,当然,xiaoming,或者user也可以理解是路由参数,就是看我们的页面中是否需要接收而已。,

获取查询字符串

必须先有一个页面跳转发送参数。例如,在Home组件中跳转到User组件中,需要传递name和pwd查询字符串。
# Home.vue

<template>
    <div>
      <h2>我是Home页面</h2>
      <router-link to="/user?name=jack&pwd=123">点我发送查询字符串</router-link>
    </div>
</template>


# url: http://localhost:8080/user?name=jack&pwd=123
# 此处是静态数据的传递,还可以使用模版字符串语法传递动态数据,如:
<router-link :to="`/user?name=${name}&pwd=${pwd}`">点我发送查询字符串</router>

User.vue组件内接收参数

# User.vue
<script>
    export default {
        name: "User",
        created(){
        	console.log(this.$route.query);	
            console.log(this.$route.query.name);
            console.log(this.$route.query.pwd)
        },
    }
</script>

# this.$route.query是一个字典对象:{name: "jack", pwd: "123"}

获取路由参数

首先设置一个route/index.js中路由信息里面,哪一段路由属于路由参数。

export default new Router({
  mode: "history",
  routes: [
    {
        name: 'Home',
        path : '/home',
        component: Home,
    },
    {
        name: 'User',
        path: "/user/:name/:id",  // 声明当前地址的2个路由参数名name,id
        component: User
    },
  ],
})

# url: http://localhost:8080/user/jack/101
# 此时在直接访问'/user'则访问不到user页面

Home.vue页面

<template>
    <div>
      <h2>我是Home页面</h2>
      <router-link to="/user/jack/101">点我发送路由参数</router-link>
    </div>
</template>

User.vue页面

<script>
    export default {
        name: "User",
        created(){
            console.log(this.$route.params);
            console.log(this.$route.params.name);
            console.log(this.$route.params.id);
        },
    }
</script>

# this.$route.params是一个字典对象:{name: "jack", id: "101"}

ElementUI

Vue开发前端项目中,比较常用的就是ElementUI了。

ElementUI是饿了么团队开发的一个UI组件框架,这个框架提前帮我们提供了很多已经写好的通用模块,我们可以在Vue项目中引入来使用,这个框架的使用类似于我们前面学习的bootstrap框架,也就是说,我们完全可以把官方文档中的组件代码拿来就用,有定制性的内容,可以直接通过样式进行覆盖修改就可以了。

中文官网:http://element-cn.eleme.io/#/zh-CN

文档快速入门:http://element-cn.eleme.io/#/zh-CN/component/quickstart

快速安装elementui

# 项目根目录
npm i element-ui -S

配置ElementUI到项目中

# 在main.js中导入ElementUI,并调用

// 导入
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

// 调用插件
Vue.use(ElementUI);

成功引入了ElementUI以后,接下来我们就可以开始进入前端页面开发

posted @ 2020-06-22 22:37  the3times  阅读(287)  评论(0编辑  收藏  举报