Vue的学习(六)
51、vue-router之使用transition设置炫酷的路由组件过渡动画效果:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>vue-router之使用transition设置炫酷的路由组件过渡动画效果</title> 6 <script src="./lib/vue.js"></script> 7 <script src="./lib/vue-router.js"></script> 8 <link href="./lib/animate.css" rel="stylesheet"/> 9 </head> 10 <body> 11 <div id="app"> 12 <router-link to="/">首页</router-link> 13 <a href="http://www.baidu.com">百度</a> 14 <router-link to="/about">关于我们</router-link> 15 <router-view></router-view> 16 </div> 17 <script type="text/x-template" id="home"> 18 <div> 19 <li v-for="v in news"> 20 <!--只要要绑定变量,都可用v-bind: 简写 :--> 21 <!-- 22 .prevent: 阻止 a 标签的默认跳转行为 23 --> 24 <a href="" @click.prevent="go(v.id)">{{v.title}}</a> 25 </li> 26 </div> 27 </script> 28 <script type="text/x-template" id="content"> 29 <!--设置组件进入的动画--> 30 <transition enter-active-class="animated fadeOutDown"> 31 <div> 32 <li>{{field.title}} - {{field.id}}</li> 33 <p> 34 {{field.content}} 35 </p> 36 <a href="" @click.prevent="back()">返回</a> 37 </div> 38 </transition> 39 </script> 40 </body> 41 <script> 42 const data = [ 43 {id: 1, title: 'PHP开源免费框架', content: '这是PHP的内容...'}, 44 {id: 2, title: 'CMS开源免费框架', content: '这是CMS的内容...'}, 45 {id: 3, title: '关于我们', content: '一个还不知道未来会发生什么的少年,在拼命的学习中....'} 46 ]; 47 // 定义组件 48 const home = { 49 template: "#home", 50 /*子组件的data是一个匿名函数*/ 51 data() { 52 return { 53 news: data 54 } 55 }, 56 methods: { 57 go(id) { 58 //第一种传路径的方式 59 //const url = "/content/" + id; 60 //第二种传路径的方式 61 // const url = {path:'/content/'+id}; 62 //第三种传路径的方式 63 const url = {name: 'content', params: {id: id}}; 64 /* 65 * $route:获取参数用的 66 * $router:设置路由用的 67 * */ 68 //push会保存历史记录 69 this.$router.push(url); 70 //replace会替换掉当前的路径 71 // this.$router.replace(url); 72 } 73 } 74 }; 75 const content = { 76 template: "#content", 77 /*子组件的data是一个匿名函数*/ 78 data() { 79 return { 80 field: {} 81 } 82 }, 83 /* 84 * 用 watch 来监听路由,只要路由发生改变就重新加载 content 组件的内容 85 * */ 86 watch: { 87 '$route'(to, from) { 88 this.load(); 89 } 90 }, 91 /* 92 * mounted钩子函数的调用时机: 93 * 编译好的HTML挂载到页面完成后执行的事件钩子,此钩子函数中一般会 94 * 做一些ajax请求获取数据来进行数据初始化 95 * 注意:mounted在整个实例中只执行一次 96 * */ 97 /* 98 * mounted的内容只在组件加载完的时候执行一次,也就是同一个组件只执行一次,不管页面后面的数据改不改变 99 * */ 100 mounted() { 101 this.load(); 102 }, 103 methods: { 104 load() { 105 let id = this.$route.params.id; 106 for (let k = 0; k < data.length; k++) { 107 if (data[k].id == id) { 108 this.field = data[k]; 109 } 110 } 111 }, 112 back() { 113 /* 114 * 如果这里使用了this.$router.go(-1),则上面的路由跳转 115 * 就不能使用this.$router.replace(url),因为这个是替换掉路径的,没有历史记录 116 * */ 117 /*go(-1): 返回上一页去*/ 118 this.$router.go(-1); 119 } 120 } 121 }; 122 //定义路由器,然后把组件交给路由器 123 let routes = [ 124 /*:id :定义了一个名为id的变量*/ 125 /*路由带有变量的时候给路由一个名称,便于后面的调用*/ 126 {path: '/', component: home}, 127 {path: '/content/:id', component: content, name: 'content'}, 128 /*alias: 定义路由的别名,是一个数组,所以可以定义多个别名*/ 129 {path: '/content/3', alias: ['/about']} 130 ]; 131 132 //routes:routes可以写成routes 133 // let router = new VueRouter({routes:routes}); 134 let router = new VueRouter({routes}); 135 new Vue({ 136 el: '#app', 137 //把路由器注入主组件中,这样才有效果 138 /* 139 * 注意:router 与 routes 的区别: 140 * router 是一个机制,相当于一个管理者,它来管理路由。 141 * routes 是一组路由,把上面的每一条路由组合起来,形成一个数组。 142 * route,它是一条路由。 143 * */ 144 //如果 router的名称和router的一样可以直接写成 router 即可 145 // router: router 146 router 147 }) 148 </script> 149 </html>
52、vue之vuex的使用场景分析与state购物车实例:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <script src="./lib/vue.js"></script> 7 <script src="./lib/vuex.js"></script> 8 </head> 9 <body> 10 <div id="app"> 11 <lists></lists> 12 </div> 13 14 <script type="text/x-template" id="lists"> 15 <!--必须只有一个根目录--> 16 <div> 17 <table border="1px" width="800px"> 18 <caption align="top">购物车</caption> 19 <tr> 20 <td>编号</td> 21 <td>名称</td> 22 <td>价格</td> 23 <td>数量</td> 24 <td>总计</td> 25 </tr> 26 <tr v-for="v in goods"> 27 <td>{{v.id}}</td> 28 <td>{{v.title}}</td> 29 <td>{{v.price}}</td> 30 <td><input type="text" v-model="v.num"/></td> 31 <td>{{v.totalPrice}}</td> 32 </tr> 33 <tr> 34 <td colspan="5">总价:{{totalPrice}}</td> 35 </tr> 36 </table> 37 </div> 38 </script> 39 40 <script> 41 let lists = { 42 template: '#lists', 43 /*computed定义的数据与data定义的数据差不多一样,只不过computed的数据是变化的*/ 44 computed: { 45 totalPrice() { 46 return this.$store.getters.totalPrice; 47 }, 48 goods() { 49 return this.$store.getters.goods; 50 } 51 } 52 }; 53 let store = new Vuex.Store({ 54 state: { 55 goods: [ 56 {id: 1, title: 'iphone7Plus', price: 999, num: 2}, 57 {id: 2, title: '华为荣耀7', price: 888, num: 3} 58 ] 59 }, 60 /*就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。*/ 61 getters: { 62 // 获取商品总价 63 // es6的写法 64 totalPrice: state => { 65 let totalPrice = 0; 66 state.goods.forEach((v) => { 67 totalPrice += v.num * v.price; 68 }); 69 return totalPrice; 70 }, 71 /* 72 * 上面的箭头函数等价于下面的,不过作用域不同,上面在箭头函数里面的 this 代表 state,而下面的函数的 this 并不是 state 73 * totalPrice: function(state) { 74 * let totalPrice = 0; 75 * state.goods.forEach((v) => { 76 * totalPrice += v.num * v.price; 77 * }); 78 * return totalPrice; 79 * } 80 * 81 * */ 82 //获取商品并计算每件商品的总价 83 goods(state) { 84 let goods = state.goods; 85 goods.forEach((v) => { 86 v.totalPrice = v.num*v.price; 87 }); 88 return goods; 89 } 90 } 91 }); 92 new Vue({ 93 el: '#app', 94 //把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件 95 store, 96 components: { 97 lists 98 } 99 }); 100 </script> 101 </body> 102 </html>
53、vuex之将购物车底部生成新组件用于统计总价:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>vuex之将购物车底部生成新组件用于统计总价</title> 6 <script src="./lib/vue.js"></script> 7 <script src="./lib/vuex.js"></script> 8 </head> 9 <body> 10 <div id="app"> 11 <lists></lists> 12 <footer-cart></footer-cart> 13 </div> 14 15 <script type="text/x-template" id="lists"> 16 <!--必须只有一个根目录--> 17 <div> 18 <table border="1px" width="800px"> 19 <caption align="top">购物车</caption> 20 <tr> 21 <td>编号</td> 22 <td>名称</td> 23 <td>价格</td> 24 <td>数量</td> 25 <td>总计</td> 26 </tr> 27 <tr v-for="v in goods"> 28 <td>{{v.id}}</td> 29 <td>{{v.title}}</td> 30 <td>{{v.price}}</td> 31 <td><input type="text" v-model="v.num"/></td> 32 <td>{{v.totalPrice}}</td> 33 </tr> 34 </table> 35 </div> 36 </script> 37 <script type="text/x-template" id="footerCart"> 38 <div style="width: 800px; border: solid 1px red; background: green;"> 39 总计:{{totalPrice}} 40 </div> 41 </script> 42 43 <script> 44 let lists = { 45 template: '#lists', 46 /*computed定义的数据与data定义的数据差不多一样,只不过computed的数据是变化的*/ 47 computed: { 48 goods() { 49 return this.$store.getters.goods; 50 } 51 } 52 }; 53 let footerCart = { 54 template: '#footerCart', 55 computed: { 56 totalPrice() { 57 return this.$store.getters.totalPrice; 58 } 59 } 60 }; 61 let store = new Vuex.Store({ 62 state: { 63 goods: [ 64 {id: 1, title: 'iphone7Plus', price: 999, num: 2}, 65 {id: 2, title: '华为荣耀7', price: 888, num: 3} 66 ] 67 }, 68 /*就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。*/ 69 getters: { 70 // 获取商品总价 71 // es6的写法 72 totalPrice: state => { 73 let totalPrice = 0; 74 state.goods.forEach((v) => { 75 totalPrice += v.num * v.price; 76 }); 77 return totalPrice; 78 }, 79 /* 80 * 上面的箭头函数等价于下面的,不过作用域不同,上面在箭头函数里面的 this 代表 state,而下面的函数的 this 并不是 state 81 * totalPrice: function(state) { 82 * let totalPrice = 0; 83 * state.goods.forEach((v) => { 84 * totalPrice += v.num * v.price; 85 * }); 86 * return totalPrice; 87 * } 88 * 89 * */ 90 //获取商品并计算每件商品的总价 91 goods(state) { 92 let goods = state.goods; 93 goods.forEach((v) => { 94 v.totalPrice = v.num*v.price; 95 }); 96 return goods; 97 } 98 } 99 }); 100 new Vue({ 101 el: '#app', 102 //把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件 103 store, 104 components: { 105 lists,footerCart 106 } 107 }); 108 </script> 109 </body> 110 </html>
54、vue之使用mutations修改购物车仓库数据:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>vue之使用mutations修改购物车仓库数据</title> 6 <script src="./lib/vue.js"></script> 7 <script src="./lib/vuex.js"></script> 8 </head> 9 <body> 10 <div id="app"> 11 <lists></lists> 12 <footer-cart></footer-cart> 13 </div> 14 15 <script type="text/x-template" id="lists"> 16 <!--必须只有一个根目录--> 17 <div> 18 <div v-if="goods.length==0">亲,您的购物车没有商品了,<a href="https://www.jd.com">马上去购物吧</a></div> 19 <div v-if="goods.length>0"> 20 <table border="1px" width="800px"> 21 <caption align="top">购物车</caption> 22 <tr> 23 <td>编号</td> 24 <td>名称</td> 25 <td>价格</td> 26 <td>数量</td> 27 <td>总计</td> 28 <td>操作</td> 29 </tr> 30 <tr v-for="v in goods"> 31 <td>{{v.id}}</td> 32 <td>{{v.title}}</td> 33 <td>{{v.price}}</td> 34 <td><input type="text" v-model="v.num"/></td> 35 <td>{{v.totalPrice}}</td> 36 <!--这里的 del(v.id) 调用的是子组件 lists 的方法 del--> 37 <td><button @click="del(v.id)">删除</button></td> 38 </tr> 39 </table> 40 </div> 41 </div> 42 </script> 43 <script type="text/x-template" id="footerCart"> 44 <div style="width: 800px; border: solid 1px red; background: green;"> 45 <div v-if="totalPrice>0"> 46 总计:{{totalPrice}} 47 </div> 48 </div> 49 </script> 50 51 <script> 52 let lists = { 53 template: '#lists', 54 /*computed定义的数据与data定义的数据差不多一样,只不过computed的数据是变化的*/ 55 computed: { 56 goods() { 57 return this.$store.getters.goods; 58 } 59 }, 60 methods: { 61 del(id) { 62 /*commit('del',{id}): 调用store里的mutations的del方法并传入参数id,参数多个的话,可以使用对象的方式,即用 {} 包裹起来*/ 63 return this.$store.commit('del',id); 64 } 65 } 66 }; 67 let footerCart = { 68 template: '#footerCart', 69 computed: { 70 totalPrice() { 71 return this.$store.getters.totalPrice; 72 } 73 } 74 }; 75 let store = new Vuex.Store({ 76 //仓库 77 state: { 78 goods: [ 79 {id: 1, title: 'iphone7Plus', price: 999, num: 2}, 80 {id: 2, title: '华为荣耀7', price: 888, num: 3} 81 ] 82 }, 83 /*就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。*/ 84 //获取仓库数据,可以对获取的数据处理 85 getters: { 86 // 获取商品总价 87 // es6的写法 88 totalPrice: state => { 89 let totalPrice = 0; 90 state.goods.forEach((v) => { 91 totalPrice += v.num * v.price; 92 }); 93 return totalPrice; 94 }, 95 /* 96 * 上面的箭头函数等价于下面的,不过作用域不同,上面在箭头函数里面的 this 代表 state,而下面的函数的 this 并不是 state 97 * totalPrice: function(state) { 98 * let totalPrice = 0; 99 * state.goods.forEach((v) => { 100 * totalPrice += v.num * v.price; 101 * }); 102 * return totalPrice; 103 * } 104 * 105 * */ 106 //获取商品并计算每件商品的总价 107 goods(state) { 108 let goods = state.goods; 109 goods.forEach((v) => { 110 v.totalPrice = v.num*v.price; 111 }); 112 return goods; 113 } 114 }, 115 //修改仓库的商品 116 mutations: { 117 //删除购物车中的商品 118 del(state,param) { 119 let good; 120 for (let i=0; i<state.goods.length; i++) { 121 if (state.goods[i].id==param.id) { 122 good = i; 123 } 124 } 125 state.goods.splice(good,1); 126 } 127 } 128 }); 129 new Vue({ 130 el: '#app', 131 //把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件 132 store, 133 components: { 134 lists,footerCart 135 } 136 }); 137 </script> 138 </body> 139 </html>
55、vuex之使用actions与axios异步初始化购物车数据:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>vue之使用mutations修改购物车仓库数据</title> 6 <script src="./lib/vue.js"></script> 7 <script src="./lib/vuex.js"></script> 8 <script src="./lib/axios.js"></script> 9 </head> 10 <body> 11 <div id="app"> 12 <lists></lists> 13 <footer-cart></footer-cart> 14 </div> 15 16 <script type="text/x-template" id="lists"> 17 <!--必须只有一个根目录--> 18 <div> 19 <div v-if="goods.length==0">亲,您的购物车没有商品了,<a href="https://www.jd.com">马上去购物吧</a></div> 20 <div v-if="goods.length>0"> 21 <table border="1px" width="800px"> 22 <caption align="top">购物车</caption> 23 <tr> 24 <td>编号</td> 25 <td>名称</td> 26 <td>价格</td> 27 <td>数量</td> 28 <td>总计</td> 29 <td>操作</td> 30 </tr> 31 <tr v-for="v in goods"> 32 <td>{{v.id}}</td> 33 <td>{{v.title}}</td> 34 <td>{{v.price}}</td> 35 <td><input type="text" v-model="v.num"/></td> 36 <td>{{v.totalPrice}}</td> 37 <!--这里的 del(v.id) 调用的是子组件 lists 的方法 del--> 38 <td><button @click="del(v.id)">删除</button></td> 39 </tr> 40 </table> 41 </div> 42 </div> 43 </script> 44 <script type="text/x-template" id="footerCart"> 45 <div style="width: 800px; border: solid 1px red; background: green;"> 46 <div v-if="totalPrice>0"> 47 总计:{{totalPrice}} 48 </div> 49 </div> 50 </script> 51 52 <script> 53 let lists = { 54 template: '#lists', 55 /*computed定义的数据与data定义的数据差不多一样,只不过computed的数据是变化的*/ 56 computed: { 57 goods() { 58 return this.$store.getters.goods; 59 } 60 }, 61 methods: { 62 del(id) { 63 /*commit('del',{id}): 调用store里的mutations的del方法并传入参数id,参数多个的话,可以使用对象的方式,即用 {} 包裹起来*/ 64 //commit是触发mutations 65 return this.$store.commit('del',id); 66 } 67 } 68 }; 69 let footerCart = { 70 template: '#footerCart', 71 computed: { 72 totalPrice() { 73 return this.$store.getters.totalPrice; 74 } 75 } 76 }; 77 let store = new Vuex.Store({ 78 //仓库 79 state: { 80 goods: [] 81 }, 82 /*就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。*/ 83 //获取仓库数据,可以对获取的数据处理 84 getters: { 85 // 获取商品总价 86 // es6的写法 87 totalPrice: state => { 88 let totalPrice = 0; 89 state.goods.forEach((v) => { 90 totalPrice += v.num * v.price; 91 }); 92 return totalPrice; 93 }, 94 /* 95 * 上面的箭头函数等价于下面的,不过作用域不同,上面在箭头函数里面的 this 代表 state,而下面的函数的 this 并不是 state 96 * totalPrice: function(state) { 97 * let totalPrice = 0; 98 * state.goods.forEach((v) => { 99 * totalPrice += v.num * v.price; 100 * }); 101 * return totalPrice; 102 * } 103 * 104 * */ 105 //获取商品并计算每件商品的总价 106 goods(state) { 107 let goods = state.goods; 108 goods.forEach((v) => { 109 v.totalPrice = v.num*v.price; 110 }); 111 return goods; 112 } 113 }, 114 //修改仓库的商品 115 mutations: { 116 //删除购物车中的商品 117 del(state,param) { 118 let good; 119 for (let i=0; i<state.goods.length; i++) { 120 if (state.goods[i].id==param.id) { 121 good = i; 122 } 123 } 124 state.goods.splice(good,1); 125 }, 126 setGoods(state,param) { 127 state.goods = param.goods; 128 } 129 }, 130 //从后台抓取数据 131 actions: { 132 loadGoods(store) { 133 axios.get('55.php').then(function (response) { 134 store.commit('setGoods',{goods:response.data}) 135 }) 136 } 137 } 138 }); 139 new Vue({ 140 el: '#app', 141 //把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件 142 store, 143 components: { 144 lists,footerCart 145 }, 146 mounted() { 147 //dispatch是触发actions的 148 //调用actions里的loadGoods方法 149 this.$store.dispatch('loadGoods'); 150 } 151 }); 152 </script> 153 </body> 154 </html>
56、vuex之模块化modules开发实例:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>vuex之模块化modules开发实例</title> 6 <script src="./lib/vue.js"></script> 7 <script src="./lib/vuex.js"></script> 8 <script src="./lib/axios.js"></script> 9 </head> 10 <body> 11 <div id="app"> 12 <lists></lists> 13 <footer-cart></footer-cart> 14 </div> 15 16 <script type="text/x-template" id="lists"> 17 <!--必须只有一个根目录--> 18 <div> 19 <div v-if="goods.length==0">亲,您的购物车没有商品了,<a href="https://www.jd.com">马上去购物吧</a></div> 20 <div v-if="goods.length>0"> 21 <table border="1px" width="800px"> 22 <caption align="top">购物车</caption> 23 <tr> 24 <td>编号</td> 25 <td>名称</td> 26 <td>价格</td> 27 <td>数量</td> 28 <td>总计</td> 29 <td>操作</td> 30 </tr> 31 <tr v-for="v in goods"> 32 <td>{{v.id}}</td> 33 <td>{{v.title}}</td> 34 <td>{{v.price}}</td> 35 <td><input type="text" v-model="v.num"/></td> 36 <td>{{v.totalPrice}}</td> 37 <!--这里的 del(v.id) 调用的是子组件 lists 的方法 del--> 38 <td><button @click="del(v.id)">删除</button></td> 39 </tr> 40 </table> 41 </div> 42 </div> 43 </script> 44 <script type="text/x-template" id="footerCart"> 45 <div style="width: 800px; border: solid 1px red; background: green;"> 46 <div v-if="totalPrice>0"> 47 总计:{{totalPrice}} 48 </div> 49 </div> 50 </script> 51 52 <script> 53 let lists = { 54 template: '#lists', 55 /*computed定义的数据与data定义的数据差不多一样,只不过computed的数据是变化的*/ 56 computed: { 57 goods() { 58 console.log(this.$store.state.cart.goods); 59 return this.$store.getters['cart/goods']; 60 } 61 }, 62 methods: { 63 del(id) { 64 /*commit('del',{id}): 调用store里的mutations的del方法并传入参数id,参数多个的话,可以使用对象的方式,即用 {} 包裹起来*/ 65 //commit是触发mutations 66 return this.$store.commit('cart/del',id); 67 } 68 } 69 }; 70 let footerCart = { 71 template: '#footerCart', 72 computed: { 73 totalPrice() { 74 return this.$store.getters['cart/totalPrice']; 75 } 76 } 77 }; 78 //定义一个购物车模块 79 const cartModule = { 80 namespaced: true, 81 //在没有定义 namespaced: true 之前,state 是局部的,其调用方式为:this.$store.state.cart.goods ,其他的都是全局的,所有调用方式不变 82 //定义后:获取getters中的goods => this.$store.getters['cart/goods'] 83 //仓库 84 state: { 85 goods: [ 86 {id: 1, title: 'iphone7Plus', price: 999, num: 2}, 87 {id: 2, title: '华为荣耀7', price: 888, num: 3} 88 ] 89 }, 90 /*就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。*/ 91 //获取仓库数据,可以对获取的数据处理 92 getters: { 93 // 获取商品总价 94 // es6的写法 95 totalPrice: state => { 96 let totalPrice = 0; 97 state.goods.forEach((v) => { 98 totalPrice += v.num * v.price; 99 }); 100 return totalPrice; 101 }, 102 /* 103 * 上面的箭头函数等价于下面的,不过作用域不同,上面在箭头函数里面的 this 代表 state,而下面的函数的 this 并不是 state 104 * totalPrice: function(state) { 105 * let totalPrice = 0; 106 * state.goods.forEach((v) => { 107 * totalPrice += v.num * v.price; 108 * }); 109 * return totalPrice; 110 * } 111 * 112 * */ 113 //获取商品并计算每件商品的总价 114 goods(state) { 115 let goods = state.goods; 116 goods.forEach((v) => { 117 v.totalPrice = v.num*v.price; 118 }); 119 return goods; 120 } 121 }, 122 //修改仓库的商品 123 mutations: { 124 //删除购物车中的商品 125 del(state,param) { 126 let good; 127 for (let i=0; i<state.goods.length; i++) { 128 if (state.goods[i].id==param.id) { 129 good = i; 130 } 131 } 132 state.goods.splice(good,1); 133 }/*, 134 setGoods(state,param) { 135 state.goods = param.goods; 136 }*/ 137 }/*, 138 //从后台抓取数据 139 actions: { 140 loadGoods(store) { 141 axios.get('55.php').then(function (response) { 142 store.commit('setGoods',{goods:response.data}) 143 }) 144 } 145 }*/ 146 }; 147 let store = new Vuex.Store({ 148 modules: { 149 cart: cartModule 150 } 151 }); 152 new Vue({ 153 el: '#app', 154 //把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件 155 store, 156 components: { 157 lists,footerCart 158 }/*, 159 mounted() { 160 //dispatch是触发actions的 161 //调用actions里的loadGoods方法 162 this.$store.dispatch('loadGoods'); 163 }*/ 164 }); 165 </script> 166 </body> 167 </html>
57、配置 vue 项目请求 java 后端项目:
主要修改:config/index.js 文件
1 'use strict' 2 // Template version: 1.3.1 3 // see http://vuejs-templates.github.io/webpack for documentation. 4 5 const path = require('path') 6 7 module.exports = { 8 dev: { 9 10 // Paths 11 assetsSubDirectory: 'static', 12 assetsPublicPath: '/', 13 //路由接口代理配置 14 proxyTable: { 15 '/api': { 16 target: 'http://localhost:8443', // 后端项目的访问根路径 17 changeOrigin: true, 18 pathRewrite: { 19 '^/api': '' 20 } 21 } 22 }, 23 24 // Various Dev Server settings 25 host: 'localhost', // can be overwritten by process.env.HOST 26 port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 27 autoOpenBrowser: false, 28 errorOverlay: true, 29 notifyOnErrors: true, 30 poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 31 32 33 /** 34 * Source Maps 35 */ 36 37 // https://webpack.js.org/configuration/devtool/#development 38 devtool: 'cheap-module-eval-source-map', 39 40 // If you have problems debugging vue-files in devtools, 41 // set this to false - it *may* help 42 // https://vue-loader.vuejs.org/en/options.html#cachebusting 43 cacheBusting: true, 44 45 cssSourceMap: true 46 }, 47 48 build: { 49 // Template for index.html 50 index: path.resolve(__dirname, '../dist/index.html'), 51 52 // Paths 53 assetsRoot: path.resolve(__dirname, '../dist'), 54 assetsSubDirectory: 'static', 55 assetsPublicPath: '/', 56 57 /** 58 * Source Maps 59 */ 60 61 productionSourceMap: true, 62 // https://webpack.js.org/configuration/devtool/#production 63 devtool: '#source-map', 64 65 // Gzip off by default as many popular static hosts such as 66 // Surge or Netlify already gzip all static assets for you. 67 // Before setting to `true`, make sure to: 68 // npm install --save-dev compression-webpack-plugin 69 productionGzip: false, 70 productionGzipExtensions: ['js', 'css'], 71 72 // Run the build command with an extra argument to 73 // View the bundle analyzer report after build finishes: 74 // `npm run build --report` 75 // Set to `true` or `false` to always turn it on or off 76 bundleAnalyzerReport: process.env.npm_config_report 77 } 78 }
main.js 文件:
1 // The Vue build version to load with the `import` command 2 // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 import Vue from 'vue' 4 import App from './App' 5 import router from './router' 6 import axios from 'axios' 7 //设置反向代理,前端请求默认发送到 http://localhost:8443/api 8 axios.defaults.baseURL = 'http://localhost:8443/api'; 9 //将 API 方法绑定到全局 10 Vue.prototype.$axios = axios; 11 12 Vue.config.productionTip = false; 13 14 /* eslint-disable no-new */ 15 new Vue({ 16 el: '#app', 17 router, 18 components: { App }, 19 template: '<App/>' 20 });
springboot 的 controller 的配置:
1 package com.mgy.controller; 2 3 import com.mgy.pojo.VueLoginInfoVo; 4 import com.mgy.result.Result; 5 import javax.validation.Valid; 6 7 import org.springframework.stereotype.Controller; 8 import org.springframework.web.bind.annotation.*; 9 import org.springframework.web.util.HtmlUtils; 10 11 import java.util.Objects; 12 13 /** 14 * @author MGY 15 * @data 2020/1/5 19:33 16 */ 17 @Controller 18 public class LoginController { 19 20 /** 21 * 登录控制器,前后端分离用的不同协议和端口,所以需要加入 @CrossOrigin 支持跨域。 22 * @param vueLoginInfoVo 23 * @return 24 */ 25 @CrossOrigin 26 @PostMapping(value = "/api/login") 27 @ResponseBody 28 public Result login(@Valid @RequestBody VueLoginInfoVo vueLoginInfoVo) { 29 // 对 html 标签进行转义,防止 XSS 攻击 30 String username = vueLoginInfoVo.getUsername(); 31 username = HtmlUtils.htmlEscape(username); 32 33 if (!Objects.equals("admin", username) || !Objects.equals("123456", vueLoginInfoVo.getPassword())) { 34 String message = "账号密码错误"; 35 System.out.println("test"); 36 return new Result(400); 37 } else { 38 return new Result(200); 39 } 40 } 41 }
配置文件 application.properties :
1 server.port=8443