6-5 vue-router、vue-cli和单文件组件-模块化开发
目录:
- vue-router 模块化
- axios模块化
- 自定义组件添加事件
一、vue-router 模块化
我们在安装webpack的时候,并没有默认安装 vue-router,所以我们这会需要安装 vue-router,并且实现vue-router的模块化。
目录结构:
vue-cli-demo //项目名
|-node_modules //插件安装目录
|-src
|-assets //项目所需的资源目录(静态资源)
|-logs.png
|-components //手动创建我们需要 路由 跳转的组件(分别是home和news)
|-MyButton.vue //自定义按钮组件,在App.vue中调用,并且 绑定事件
|-Home.vue //<template><div id="home"><h1>这是主页</h1></div></template>
|-News.vue //<template><div id="news"><h1>这是新闻</h1></div></template>
|-App.vue
|-main.js //入口文件
|-routes.config.js //单独手动创建配置路由的文件
|-.babelrc
|-editorconfig
|-.gitignore
|-index.html //挂载文件
|-package.json //工程文件
|-package-lock.json
|-README.md
|-webpack.config.js //webpack配置文件
思路图:

1.1、vue-router安装
#进入webpack项目 D:\PycharmProjects\vue>cd vue-cli-demo #安装生产需要的 vue-router 模块,-S:指的是生产需要 D:\PycharmProjects\vue\vue-cli-demo>npm install vue-router -S
1.2、编辑main.js
说明:当我们导入 vue-router的时候需要使用 Vue.use()安装插件,具体使用方法:Vue.use(plugin)
import Vue from 'vue'
import App from './App.vue'
#'vue-router' 是固定的,是我们安装vue-router的名字,VueRouter 是别名
import VueRouter from 'vue-router'
//使用VueRouter
Vue.use(VueRouter);
new Vue({
el: '#app',
render: h => h(App)
})
1.3、 编辑 App.vue
说明:vue-router路由组件导入之后,router-link标签就可以在任何组件中使用
<template>
<div id="app">
{{msg}}
<!--设置路由指向-->
<div>
<router-link to="/home">主页</router-link>
<router-link to="/news">新闻</router-link>
</div>
<!--路由显示的内容-->
<div>
<keep-alive>
<router-view></router-view>
</keep-alive>
</div>
</div>
</template>
<script>
//export default{}
</script>
1.4、编辑router.config.js
//专门搞一个路由配置文件
import Home from './components/Home.vue'
import News from './components/News.vue'
export default { //之前我们定义在外面的,现在我们把它定义在对象里面
routes: [
{
path:'/home',
component: Home
},
{
path:'/news',
component: News
}
]
}
1.5、在main.js中导入router.config.js
import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
//导入路由配置文件
import routerConfig from './routes.config.js'
Vue.use(VueRouter);
//创建路由实例
const router = new VueRouter(routerConfig);
new Vue({
el: '#app',
render: h => h(App),
router //创建好的路由实例,需要在vue实例中适配一下
});
1.6、对路由监视,编写App.vue
说明: 主要通过 watch选项,监视 $route的路由变化。关于watch的使用:实例方法/数据
<template>
//html内容,上面的App.vue中有
</template>
<script>
export default {
name: 'app',
data() {
//数据
},
mounted(){
console.log(this.$route); //$route是router-link自身提供的,获取当前路由信息
},
watch:{ //对路由监视
$route: (newValue,oldValue) => { //newValue,oldValue都是对象
console.log('旧值:'+oldValue.path,'新值:'+newValue.path);
}
}
}
</script>
知识点:(非常重要!!!)
就是说我们在模块化开发的过程中,一个js文件需要导入其他js文件中的 属性或者方法也好,需要在定义完成属性和方法之后,需要以对象的方式进行导出后,再去引用:
//1.routes.js 定义
//定义常量
const routes= [....]
//必须导出单个对象
export default routes
//必须导出多个对象,这样其他js文件才能使用
export default {routes,....}
//2.main.js中引用
//必须导入路由对象
import routes from './routes.js'
//引用导入的路由对象
const router = new VueRouter(routes);
好了,路由配置结束了。
二、axios模块化
2.1、axios的安装
注:-S表示生产依赖,-D表示开发依赖,安装axios目的是给后端项目发送ajax请求
D:\PycharmProjects\vue>cd vue-cli-demo #安装 axios插件 D:\PycharmProjects\vue\vue-cli-demo>npm install axios -S
2.2、axios的使用
说明:axios跟vue-router是不一样的,vue-router只要我在main.js入口文件引入,并且 Vue.use()使用就可以。axios就不一样了,axios是没有办法采用 Vue.use(axios)方式去全局引用。
- 方式1:在每个组件中引入axios
- 方式2:在main.js中全局引入axios并添加到Vue原型中
方式1:在每个组件中都需要引入axios
//1.在App.vue中引用
<template>
<div id="app">
<!--触发事件按钮-->
<button @click="send">发送AJAX请求</button>
</div>
</template>
<script>
//导入axios
import axios from 'axios'
//在组件对象中使用
export default {
methods:{
send(){ //请求ajax方法
axios.get("url").then(resp=>{}).catch(err=>{});
}
}
}
</script>
//2.其他组件中使用也必须要引如axios插件,如New.vue组件中
<template>
//html代码
</template>
<script>
//必须导入axios
import axios from 'axios'
</script>
方式2:在main.js中全局引入axios并添加到Vue原型中
1、编写main.js入口文件
import Vue from 'vue'
import App from './App.vue'
.....
//导入axios插件
import axios from 'axios'
//添加到vue的原型中,Vue.prototype.方法名(自定义)=引入插件名
Vue.prototype.axios = axios; //一般定义为Vue.prototype.$http = axios,这个随便你自己定义
.....
new Vue({
.....
});
分析 Vue.prototype.axios = axios:其实就是给Vue的原型加一个方法,Vue.prototype.方法名(自定义)=引入插件名,这个类似Vue.component一样都是Vue的原型上加的方法。
2、在App.vue组件中使用:
说明: this.axios.get(),可以写 this.axios也可以写Vue.axios,因为在main.js中对所有Vue的原型,也就是说对所有的Vue对象加了一个axios方法。
//1.在任何组件中引用,无需导入
<template>
.....
</template>
<script>
//直接使用,无需导入axios
export default {
methods:{
send(){ //请求ajax方法
this.axios.get("url").then(resp=>{}).catch(err=>{});
}
}
}
</script>
axios模块化到此结束啦!!!
三、自定义组件添加事件
之前我们都是在组件内部绑定事件,比如说一个button按钮,绑定一个 事件,但是我们有的时候需要自定义一些组件,但是这些组件恰好是我们想要的按钮之类的组件,然后我们在组件上绑定事件,那这个时候我们怎么操作呐?
1、先自定义一个 Button按钮 组件 => MyButton.vue
<template>
<button>自定义按钮</button>
</template>
<style scoped>
button{
width: 100px;
height: 30px;
background-color: #ccc;
color: red;
}
</style>
2、在App.vue组件中引入并绑定事件
说明:MyButto组件绑定事件,绑定事件需要以 @click.native="事件名" 方式绑定。修饰符:.native - 监听组件根元素的原生事件。更多修饰符,请详细查看 v-on 指令。
<template>
<div id="app">
<!--3.MyButto组件绑定事件,绑定事件需要以 @click.native="事件名"-->
<MyButton @click.native="send"></MyButton>
<br>
<!--组件内部绑定事件-->
<button @click="send">发送AJAX请求</button>
</div>
</template>
<script>
//1.导入button按钮
import MyButton from './components/MyButton.vue'
export default {
...,
components:{
MyButton //2.导入后注册
},
methods:{
send(){
this.axios.get("https://api.github.com/users/tangyang8942").then(resp => {
console.log(resp.data);
}).catch(err => {
console.log(err);
});
}
}
}
</script>
<style>

浙公网安备 33010602011771号