Vue

渐进式 JavaScript 框架

  1. 通过对框架的了解与运用程度,来决定其在整个项目中的应用范围,最终可以独立以框架方式完成整个web前端项目

一、走进Vue

1、what -- 什么是Vue

  1. 可以独立完成前后端分离式web项目的JavaScript框架

2、why -- 为什么要学习Vue

  1. 三大主流框架之一:Angular React Vue
  2. 先进的前端设计模式:MVVM
  3. 可以完全脱离服务器端,以前端代码复用的方式渲染整个页面:组件化开发

3、special -- 特点

  1. 单页面web应用
  2. 数据驱动
  3. 数据的双向绑定
  4. 虚拟DOM

4、how -- 如何使用Vue

  1. <div id="app">
  2. {{ }}
  3. </div>
  4. <script src="js/vue.min.js"></script>
  5. <script>
  6. new Vue({
  7. el: '#app'
  8. })
  9. </script>

二、Vue实例

1、el:实例

  1. new Vue({
  2. el: '#app'
  3. })
  4. // 实例与页面挂载点一一对应
  5. // 一个页面中可以出现多个实例对应多个挂载点
  6. // 实例只操作挂载点内部内容

2、data:数据

  1. <div id='app'>
  2. {{ msg }}
  3. </div>
  4. <script>
  5. var app = new Vue({
  6. el: '#app',
  7. data: {
  8. msg: '数据',
  9. }
  10. })
  11. console.log(app.$data.msg);
  12. console.log(app.msg);
  13. </script>
  14. <!-- data为插件表达式中的变量提供数据 -->
  15. <!-- data中的数据可以通过Vue实例直接或间接访问-->

3、methods:方法

  1. <style>
  2. .box { background-color: orange }
  3. </style>
  4. <div id='app'>
  5. <p class="box" v-on:click="pClick">测试</p>
  6. <p class="box" v-on:mouseover="pOver">测试</p>
  7. </div>
  8. <script>
  9. var app = new Vue({
  10. el: '#app',
  11. methods: {
  12. pClick () {
  13. // 点击测试
  14. },
  15. pOver () {
  16. // 悬浮测试
  17. }
  18. }
  19. })
  20. </script>
  21. <!-- 了解v-on:为事件绑定的指令 -->
  22. <!-- methods为事件提供实现体-->

4、computed:计算

  1. <div id="app">
  2. <input type="text" v-model="a">
  3. <input type="text" v-model="b">
  4. <div>
  5. {{ c }}
  6. </div>
  7. </div>
  8. <script>
  9. // 一个变量依赖于多个变量
  10. new Vue({
  11. el: "#app",
  12. data: {
  13. a: "",
  14. b: "",
  15. },
  16. computed: {
  17. c: function() {
  18. // this代表该vue实例
  19. return this.a + this.b;
  20. }
  21. }
  22. })
  23. </script>

5、watch:监听

  1. <div id="app">
  2. <input type="text" v-model="ab">
  3. <div>
  4. {{ a }}
  5. {{ b }}
  6. </div>
  7. </div>
  8. <script>
  9. // 多个变量依赖于一个变量
  10. new Vue({
  11. el: "#app",
  12. data: {
  13. ab: "",
  14. a: "",
  15. b: "",
  16. },
  17. watch: {
  18. ab: function() {
  19. // 逻辑根据需求而定
  20. this.a = this.ab[0];
  21. this.b = this.ab[1];
  22. }
  23. }
  24. })
  25. </script>

6、delimiters:分隔符

  1. <div id='app'>
  2. ${ msg }
  3. </div>
  4. <script>
  5. new Vue({
  6. el: '#app',
  7. data: {
  8. msg: 'message'
  9. },
  10. delimiters: ['${', '}']
  11. })
  12. </script>

三、生命周期钩子

  • 表示一个vue实例从创建到销毁的这个过程,将这个过程的一些时间节点赋予了对应的钩子函数
  • 钩子函数: 满足特点条件被回调的方法
  1. new Vue({
  2. el: "#app",
  3. data: {
  4. msg: "message"
  5. },
  6. beforeCreate () {
  7. console.log("实例刚刚创建");
  8. console.log(this.msg
  9. },
  10. created () {
  11. console.log("实例创建成功, data, methods已拥有");
  12. console.log(this.msg);
  13. },
  14. mounted () {
  15. console.log("页面已被vue实例渲染, data, methods已更新");
  16. }
  17. // 拿到需求 => 确定钩子函数 => 解决需求的逻辑代码块
  18. })

四、Vue指令

1、文本相关指令

  1. <div id="app">
  2. <!-- 插值表达式 -->
  3. <p>{{ msg }}</p>
  4. <!-- eg:原文本会被msg替换 -->
  5. <p v-text='msg'>原文本</p>
  6. <!-- 可以解析带html标签的文本信息 -->
  7. <p v-html='msg'></p>
  8. <!-- v-once控制的标签只能被赋值一次 -->
  9. <p v-once>{{ msg }}</p>
  10. </div>
  11. <script type="text/javascript">
  12. // 指令: 出现在html标签中可以被vue解析处理的全局属性
  13. new Vue({
  14. el: "#app",
  15. data: {
  16. msg: "message"
  17. }
  18. })
  19. </script>

2、斗篷指令

  1. <style type="text/css">
  2. [v-cloak] { display: none; }
  3. </style>
  4. <div id="app" v-cloak>
  5. {{ msg }}
  6. </div>
  7. <script src="js/vue.min.js"></script>
  8. <script type="text/javascript">
  9. new Vue({
  10. el: "#app",
  11. data: {
  12. msg: "message"
  13. }
  14. })
  15. </script>
  16. <!-- 避免页面闪烁-->

3、属性指令

  1. <!-- 给自定义全局属性绑定变量 -->
  2. <p v-bind:abc="abc"></p>
  3. <!-- 以原字符串形式绑定全局属性 -->
  4. <p v-bind:title="'abc'"></p>
  5. <!-- 单类名绑定 -->
  6. <p v-bind:class="c1"></p>
  7. <!-- 多类名绑定 -->
  8. <p v-bind:class="[c2, c3]"></p>
  9. <!-- 类名状态绑定 -->
  10. <p v-bind:class="{c4: true|false|var}"></p>
  11. <!-- 多类名状态绑定 -->
  12. <p v-bind:class="[{c5: true}, {c6: flase}]"></p>
  13. <!-- 样式绑定 -->
  14. <div :style="div_style"></div>
  15. <div :style="{width: '100px', height: '100px', backgroundColor: 'blue'}"></div>
  16. <script type="text/javascript">
  17. new Vue({
  18. el:"#app",
  19. data: {
  20. abc: "abc",
  21. c1: "p1",
  22. c2: "p2",
  23. c3: "p3",
  24. div_style: {
  25. width: "200px",
  26. height: "200px",
  27. backgroundColor: "cyan"
  28. }
  29. }
  30. })
  31. </script>
  32. <!-- v-bind: 指令可以简写为 : -->

4、事件指令

  1. <!-- v-on: 指令 简写 @ -->
  2. <!-- 不传参事件绑定,但事件回调方法可以获取事件对象 -->
  3. <p @click="fn"></p>
  4. <!-- ()可以传入具体实参 -->
  5. <p @click="fn()"></p>
  6. <!-- ()情况下,事件对象应该显式传入 -->
  7. <p @click="fn($event)"></p>

5、表单指令

  1. <div id="app">
  2. <!-- v-model针对于表单元素 -->
  3. <form action="" method="get">
  4. <!-- 1、双向绑定:服务于文本输入框 -->
  5. <!-- v-model存储的值为输入框的value值 -->
  6. <div>
  7. <input type="text" name="usr" v-model="in_val">
  8. <input type="password" name="ps" v-model="in_val" >
  9. <textarea name="info" v-model="in_val"></textarea>
  10. </div>
  11. <!-- 2、单选框 -->
  12. <div>
  13. <!-- 单选框是以name进行分组,同组中只能发生单选 -->
  14. <!-- v-model存储的值为单选框的value值 -->
  15. 男:<input type="radio" name="sex" value="男" v-model="ra_val">
  16. 女:<input type="radio" name="sex" value="女" v-model="ra_val">
  17. {{ ra_val }}
  18. </div>
  19. <!-- 3、单一复选框 -->
  20. <!-- v-model存储的值为true|false -->
  21. <!-- 或者为自定义替换的值 -->
  22. <div>
  23. <input type="checkbox" v-model='sin_val' true-value="选中" false-value="未选中" />
  24. {{ sin_val }}
  25. </div>
  26. <!-- 4、多复选框 -->
  27. <!-- v-model存储的值为存储值多复选框value的数组 -->
  28. <div>
  29. <input type="checkbox" value="喜好男的" name="cless" v-model='more_val' />
  30. <input type="checkbox" value="喜好女的" name="cless" v-model='more_val' />
  31. <input type="checkbox" value="不挑" name="cless" v-model='more_val' />
  32. {{ more_val }}
  33. </div>
  34. </form>
  35. </div>
  36. <script type="text/javascript">
  37. new Vue({
  38. el: '#app',
  39. data: {
  40. in_val: '',
  41. // 默认值可以决定单选框默认选项
  42. ra_val: '男',
  43. // 默认值为true,单一复选框为选中,反之false为不选中
  44. sin_val: '',
  45. // 数组中存在的值对应的复选框默认为选中状态
  46. more_val: ['喜好女的','不挑']
  47. }
  48. })
  49. </script>

6、条件指令

  1. <div id="app">
  2. <button @click="toggle">显隐切换</button>
  3. <!-- v-if -->
  4. <div class="box r" v-if="isShow"></div>
  5. <!-- v-show -->
  6. <div class="box o" v-show="isShow"></div>
  7. <!-- 1.条件渲染的值为true|false -->
  8. <!-- 2.true代表标签显示方式渲染 -->
  9. <!-- 3.false v-if不渲染到页面,v-show以display:none渲染到页面,但也不会显示 -->
  10. <!-- v-if v-else-if v-else 案例 -->
  11. <ul>
  12. <li @mouseover="changeWrap(0)">red</li>
  13. <li @mouseover="changeWrap(1)">green</li>
  14. <li @mouseover="changeWrap(2)">blue</li>
  15. </ul>
  16. <!-- red页面逻辑结构 -->
  17. <div class="wrap red" v-if="tag == 0" key="0">...</div>
  18. <!-- green页面逻辑结构 -->
  19. <div class="wrap green" v-else-if="tag == 1" key="1">...</div>
  20. <!-- blue页面逻辑结构 -->
  21. <div class="wrap blue" v-else key="2">...</div>
  22. <!-- v-if相关分支操作,在未显示情况下,是不会被渲染到页面中 -->
  23. <!-- 通过key全局属性操作后,渲染过的分支会建立key对应的缓存,提高下一次渲染速度 -->
  24. <!-- v-show 案例 -->
  25. <ul>
  26. <li @mouseover="changeMain(0)">red</li>
  27. <li @mouseover="changeMain(1)">green</li>
  28. <li @mouseover="changeMain(2)">blue</li>
  29. </ul>
  30. <!-- red页面逻辑结构 -->
  31. <div class="main red" v-show="whoShow(0)">...</div>
  32. <!-- green页面逻辑结构 -->
  33. <div class="main green" v-show="whoShow(1)">...</div>
  34. <!-- blue页面逻辑结构 -->
  35. <div class="main blue" v-show="whoShow(2)">...</div>
  36. </div>
  37. <script type="text/javascript">
  38. new Vue({
  39. el: "#app",
  40. data: {
  41. isShow: false,
  42. tag: 0,
  43. flag: 0
  44. },
  45. methods: {
  46. toggle () {
  47. this.isShow = !this.isShow;
  48. },
  49. changeWrap (num) {
  50. this.tag = num;
  51. },
  52. changeMain (num) {
  53. // this.flag num
  54. this.flag = num;
  55. },
  56. whoShow (num) {
  57. // this.flag num
  58. return this.flag == num;
  59. }
  60. }
  61. })
  62. </script>

7、循环指令

  1. <div id="app">
  2. <h1>{{ msg }}</h1>
  3. <!-- v-for="item in items" -->
  4. <!-- 遍历的对象: 数组[] 对象(字典){} -->
  5. <ul>
  6. <li>{{ list[0] }}</li>
  7. <li>{{ list[1] }}</li>
  8. <li>{{ list[2] }}</li>
  9. <li>{{ list[3] }}</li>
  10. <li>{{ list[4] }}</li>
  11. </ul>
  12. <!-- n为遍历的元素值 -->
  13. <ul>
  14. <li v-for="n in list">{{ n }}</li>
  15. </ul>
  16. <!-- 一般列表渲染需要建立缓存 -->
  17. <!-- 列表渲染是循环,需要赋值变量给key,使用key需要v-bind:处理 -->
  18. <!-- v-for变量数组[]时,接收两个值时,第一个为元素值,第二个为元素索引 -->
  19. <ul>
  20. <li v-for="(n, i) in list" :key="i">value:{{ n }} | index: {{ i }}</li>
  21. </ul>
  22. <ul>
  23. <li>{{ dic['name'] }}</li>
  24. <li>{{ dic.age }}</li>
  25. <li>{{ dic.gender }}</li>
  26. </ul>
  27. <!-- v-for变量对象{}时,接收三个值时,第一个为元素值,第二个为元素键,第三个为元素索引 -->
  28. <ul>
  29. <li v-for="(v, k, i) in dic" :key="k">value:{{ v }} | key:{{ k }} | index: {{ i }}</li>
  30. </ul>
  31. <!-- 遍历的嵌套 -->
  32. <div v-for="(person, index) in persons" :key="index" style="height: 21px;">
  33. <div v-for="(v, k) in person" :key="k" style="float: left;">{{ k }} : {{ v }}&nbsp;&nbsp;&nbsp;</div>
  34. </div>
  35. </div>
  36. <script type="text/javascript">
  37. new Vue({
  38. el: "#app",
  39. data: {
  40. msg: "列表渲染",
  41. list: [1, 2, 3, 4, 5],
  42. dic: {
  43. name: 'zero',
  44. age: 88888,
  45. gender: 'god'
  46. },
  47. persons: [
  48. {name: "zero", age: 8},
  49. {name: "egon", age: 78},
  50. {name: "liuXX", age: 77},
  51. {name: "yXX", age: 38}
  52. ]
  53. }
  54. })
  55. </script>

8、todolist案例

  1. <div id="app">
  2. <div>
  3. <input type="text" v-model="val">
  4. <button type="button" @click="submitMsg">提交</button>
  5. </div>
  6. <ul>
  7. <li v-for="(v, i) in list" :key="i" @click="removeMsg(i)">{{ v }}</li>
  8. </ul>
  9. {{ list }}
  10. </div>
  11. <script type="text/javascript">
  12. new Vue({
  13. el: "#app",
  14. data: {
  15. val: "",
  16. list: []
  17. },
  18. methods: {
  19. submitMsg () {
  20. if (this.val) {
  21. this.list.push(this.val);
  22. this.val = ""
  23. }
  24. },
  25. removeMsg(index) {
  26. this.list.splice(index, 1)
  27. }
  28. }
  29. })
  30. </script>

五、组件

  • 每一个组件都是一个vue实例
  • 每个组件均具有自身的模板template,根组件的模板就是挂载点
  • 每个组件模板只能拥有一个根标签
  • 子组件的数据具有作用域,以达到组件的复用

1、根组件

  1. <div id="app">
  2. <h1>{{ msg }}</h1>
  3. </div>
  4. <script type="text/javascript">
  5. // 通过new Vue创建的实例就是根组件(实例与组件一一对应,一个实例就是一个组件)
  6. // 每个组件组件均拥有模板,template
  7. var app = new Vue({
  8. // 根组件的模板就是挂载点
  9. el: "#app",
  10. data : {
  11. msg: "根组件"
  12. },
  13. // 模板: 由""包裹的html代码块,出现在组件的内部,赋值给组件的$template变量
  14. // 显式书写模块,就会替换挂载点,但根组件必须拥有挂载点
  15. template: "<div>显式模板</div>"
  16. })
  17. // app.$template
  18. </script>

2、局部组件

  1. <div id="app">
  2. <local-tag></local-tag>
  3. <local-tag></local-tag>
  4. </div>
  5. <script>
  6. var localTag = {
  7. data () {
  8. return {
  9. count: 0
  10. }
  11. },
  12. template: '<button @click="btnAction">局部{{ count }}</button>',
  13. methods: {
  14. btnAction () {
  15. this.count ++
  16. }
  17. }
  18. }
  19. new Vue({
  20. el: "#app",
  21. components: {
  22. 'local-tag': localTag
  23. }
  24. })
  25. </script>

3、全局组件

  1. <div id="app">
  2. <global-tag></global-tag>
  3. <global-tag></global-tag>
  4. </div>
  5. <script>
  6. Vue.component('global-tag', {
  7. data () {
  8. return {
  9. count: 0
  10. }
  11. },
  12. template: '<button @click="btnAction">全局{{ count }}</button>',
  13. methods: {
  14. btnAction () {
  15. this.count ++
  16. }
  17. }
  18. })
  19. new Vue({
  20. el: "#app"
  21. })
  22. </script>

4、父组件传递数据给子组件

  • 通过绑定属性的方式进行数据传递
  1. <div id="app">
  2. <global-tag :sup_data1='sup_data1' :supData2='sup_data2'></global-tag>
  3. </div>
  4. <script type="text/javascript">
  5. Vue.component('global-tag', {
  6. props:['sup_data1', 'supdata2'],
  7. template: '<div>{{ sup_data1 }} {{ supdata2 }}</div>'
  8. })
  9. new Vue({
  10. el: '#app',
  11. data: {
  12. sup_data1: '数据1',
  13. sup_data2: '数据2'
  14. }
  15. })
  16. </script>

5、子组件传递数据给父组件

  • 通过发送事件请求的方式进行数据传递
  1. <div id="app">
  2. <global-tag @send_action='receiveAction'></global-tag>
  3. </div>
  4. <script type="text/javascript">
  5. Vue.component('global-tag', {
  6. data () {
  7. return {
  8. sub_data1: "数据1",
  9. sub_data2: '数据2'
  10. }
  11. },
  12. template: '<div @click="clickAction">发生</div>',
  13. methods: {
  14. clickAction () {
  15. this.$emit('send_action', this.sub_data1, this.sub_data2)
  16. }
  17. }
  18. })
  19. new Vue({
  20. el: '#app',
  21. methods: {
  22. receiveAction (v1, v2) {
  23. console.log(v1, v2)
  24. }
  25. }
  26. })
  27. </script>

6、父子组件实现todoList

  1. <div id="app">
  2. <div>
  3. <input type="text" v-model="val">
  4. <button type="button" @click="submitMsg">提交</button>
  5. </div>
  6. <ul>
  7. <!-- <li v-for="(v, i) in list" :key="i" @click="removeMsg(i)">{{ v }}</li> -->
  8. <todo-list v-for="(v, i) in list" :key="i" :v="v" :i="i" @delect_action="delect_action"></todo-list>
  9. </ul>
  10. </div>
  11. <script type="text/javascript">
  12. Vue.component("todo-list", {
  13. template: "<li @click='delect_action'><span>第{{ i + 1 }}条: </span><span>{{ v }}</span></li>",
  14. props: ['v', 'i'],
  15. methods: {
  16. delect_action () {
  17. this.$emit("delect_action", this.i)
  18. }
  19. }
  20. })
  21. new Vue({
  22. el: "#app",
  23. data: {
  24. val: "",
  25. list: []
  26. },
  27. methods: {
  28. submitMsg () {
  29. // 往list中添加input框中的value
  30. if (this.val) {
  31. this.list.push(this.val);
  32. this.val = ""
  33. }
  34. },
  35. delect_action(index) {
  36. this.list.splice(index, 1)
  37. }
  38. }
  39. })
  40. </script>

六、Vue-CLI 项目搭建

1、环境搭建

  • 安装node
  1. 官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/
  • 安装cnpm
  1. npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 安装脚手架
  1. cnpm install -g @vue/cli
  • 清空缓存处理
  1. npm cache clean --force

2、项目的创建

  • 创建项目
  1. vue creat 项目名
  2. // 要提前进入目标目录(项目应该创建在哪个目录下)
  3. // 选择自定义方式创建项目,选取Router, Vuex插件
  • 启动/停止项目
  1. npm run serve / ctrl+c
  2. // 要提前进入项目根目录
  • 打包项目
  1. npm run build
  2. // 要在项目根目录下进行打包操作

3、认识项目

  • 项目目录
  1. dist: 打包的项目目录(打包后会生成)
  2. node_modules: 项目依赖
  3. public: 共用资源
  4. src: 项目目标,书写代码的地方
  5. -- assets:资源
  6. -- components:组件
  7. -- views:视图组件
  8. -- App.vue:根组件
  9. -- main.js: 入口js
  10. -- router.js: 路由文件
  11. -- store.js: 状态库文件
  12. vue.config.js: 项目配置文件(没有可以自己新建)
  • 配置文件:vue.config.js
  1. module.exports={
  2. devServer: {
  3. port: 8888
  4. }
  5. }
  6. // 修改端口,选做
  • main.js
  1. new Vue({
  2. el: "#app",
  3. router: router,
  4. store: store,
  5. render: function (h) {
  6. return h(App)
  7. }
  8. })
  • .vue文件
  1. <template>
  2. <!-- 模板区域 -->
  3. </template>
  4. <script>
  5. // 逻辑代码区域
  6. // 该语法和script绑定出现
  7. export default {
  8. }
  9. </script>
  10. <style scoped>
  11. /* 样式区域 */
  12. /* scoped表示这里的样式只适用于组件内部, scoped与style绑定出现 */
  13. </style>

4、项目功能

  • vue-router
  1. {
  2. path: '/',
  3. name: 'home',
  4. // 路由的重定向
  5. redirect: '/home'
  6. }
  7. {
  8. // 一级路由, 在根组件中被渲染, 替换根组件的<router-view/>标签
  9. path: '/one-view',
  10. name: 'one',
  11. component: () => import('./views/OneView.vue')
  12. }
  13. {
  14. // 多级路由, 在根组件中被渲染, 替换根组件的<router-view/>标签
  15. path: '/one-view/one-detail',
  16. component: () => import('./views/OneDetail.vue'),
  17. // 子路由, 在所属路由指向的组件中被渲染, 替换该组件(OneDetail)的<router-view/>标签
  18. children: [{
  19. path: 'show',
  20. component: () => import('./components/OneShow.vue')
  21. }]
  22. }
  1. <!-- router-link渲染为a标签 -->
  2. <router-link to="/">Home</router-link> |
  3. <router-link to="/about">About</router-link> |
  4. <router-link :to="{name: 'one'}">One</router-link> |
  5. <!-- 为路由渲染的组件占位 -->
  6. <router-view />
  1. a.router-link-exact-active {
  2. color: #42b983;
  3. }
  1. // router的逻辑转跳
  2. this.$router.push('/one-view')
  3. // router采用history方式访问上一级
  4. this.$router.go(-1)
  • vuex
  1. // 在任何一个组件中,均可以通过this.$store.state.msg访问msg的数据
  2. // state永远只能拥有一种状态值
  3. state: {
  4. msg: "状态管理器"
  5. },
  6. // 让state拥有多个状态值
  7. mutations: {
  8. // 在一个一个组件中,均可以通过this.$store.commit('setMsg', new_msg)来修改state中的msg
  9. setMsg(state, new_msg) {
  10. state.msg = new_msg
  11. }
  12. },
  13. // 让mutations拥有多个状态值
  14. actions: {
  15. }
  • vue-cookie
  1. // 安装cookie的命令
  2. // npm install vue-cookie --save
  3. // 为项目配置全局vue-cookie
  4. import VueCookie from 'vue-cookie'
  5. // 将插件设置给Vue原型,作为全局的属性,在任何地方都可以通过this.$cookie进行访问
  6. Vue.prototype.$cookie = VueCookie
  1. // 持久化存储val的值到cookie中
  2. this.$cookie.set('val', this.val)
  3. // 获取cookie中val字段值
  4. this.$cookie.get('val')
  • axios
  1. // 安装 axios(ajax)的命令
  2. // npm install axios--save
  3. // 为项目配置全局axios
  4. import Axios from 'axios'
  5. Vue.prototype.$ajax = Axios
  1. let _this = this
  2. this.$ajax({
  3. method: 'post',
  4. url: 'http://127.0.0.1:5000/loginAction',
  5. params: {
  6. usr: this.usr,
  7. ps: this.ps
  8. }
  9. }).then(function(res) {
  10. // this代表的是回调then这个方法的调用者(axios插件),也就是发生了this的重指向
  11. // 要更新页面的title变量,title属于vue实例
  12. // res为回调的对象,该对象的data属性就是后台返回的数据
  13. _this.title = res.data
  14. }).catch(function(err) {
  15. window.console.log(err)
  16. })
  1. # 用pycharm启动该文件模拟后台
  2. from flask import Flask, request, render_template
  3. from flask_cors import CORS
  4. app = Flask(__name__)
  5. CORS(app, supports_credentials=True)
  6. @app.route('/')
  7. def index():
  8. return "<h1>主页</h1>"
  9. @app.route('/loginAction', methods=['GET', 'POST'])
  10. def test_action():
  11. # print(request.args)
  12. # print(request.form)
  13. # print(request.values)
  14. usr = request.args['usr']
  15. ps = request.args['ps']
  16. if usr != 'abc' or ps != '123':
  17. return 'login failed'
  18. return 'login success'
  19. if __name__ == '__main__':
  20. app.run()

vue one one的更多相关文章

  1. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  2. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  3. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  4. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  5. Vue + Webpack + Vue-loader 系列教程(2)相关配置篇

    原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ 使用预处理器 在 Webpack 中,所有的预处理器需要和一个相应的加载器一同使用.vue- ...

  6. Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇

    原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ Vue-loader 是什么? vue-loader 是一个加载器,能把如下格式的 Vue ...

  7. 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库

    应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...

  8. Vue.js 2.0 和 React、Augular等其他框架的全方位对比

    引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...

  9. 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?

    引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...

  10. 初探Vue

    Vue.js(读音/vju:/,类似于view),是近来比较火的前端框架,但一直没有怎么具体了解.实现过,就知道个啥的MVVM啦,数据驱动啦,等这些关于Vue的虚概念. 由于最近,小生在公司中,负责开 ...

随机推荐

  1. annoy超平面多维近似向量查找工具

    需求:有800万的中文词向量,要查询其中任意一个词向量对应的k个与其最邻近的向量.通常情况下如果向量集比较小的话,几十万个向量(几个G这种),我们都可以用gensim的word2vec来查找,但是88 ...

  2. 从846家初创倒下 看A轮融资后的悬崖

    看A轮融资后的悬崖" title="从846家初创倒下 看A轮融资后的悬崖"> 相比往年,今年的寒冷冬天来得更早.在互联网行业,今年的"大雪"更 ...

  3. HINOC2.0标准介绍(1):概述

    本文首发于'瀚诺观察'微信公众号 摘要: 2016年3月18日,国家新闻出版广电总局批准发布了行业标准GY/T 297-2016<NGB宽带接入系统HINOC2.0物理层和媒体接入控制层技术规范 ...

  4. python基础-基本概念

    python概念介绍 python是一门动态解释型的强类型定义语言,创始人吉多·范罗苏姆(Guido van Rossum) #编译型语言 编译型:一次性将所有程序编译成二进制文件 缺点:开发效率低, ...

  5. Java设计模式二

    今天谈的是工厂模式,该模式用于封装和对对象的创建,万物皆对象,那么万物又是产品类,如一个水果厂生产三种水果罐头,我们就可以将这三种水果作为产品类,再定义一个接口用来设定对水果罐头的生成方法,在工厂类中 ...

  6. webpack从0到1超详细超基础学习教程

    概念 自己是一个一听到webpack就头大,看着一堆不知道那是什么玩意的东西总觉得自己做好前端就行了,但是在使用vue-cli的时候总觉得要改其中的一些东西进行项目初始化的时候能够更好使用!所以想要根 ...

  7. java多线程之间的通信

    目的 如何让两个线程依次执行? 那如何让 两个线程按照指定方式有序交叉运行呢? 四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的 三个运动员各 ...

  8. 基于springcloud搭建项目-Ribbon篇(三)

    这篇文章主要是介绍一下ribbon的用法,我们都知道ribbon是负载均衡,但是却不知道他是怎么样的负载均衡,怎么用,能干嘛? ● 其实,简单的说,Spring Cloud Ribbon是基于Netf ...

  9. seo搜索优化技巧01-seo外链怎么发?

    在seo搜索优化中,seo外链的作用并没有早期的作用大了.可是高质量的外链对关键词的排名还是很重要的.星辉信息科技对seo外链怎么发以及seo外链建设中的注意点进行阐述. SEO外链如何做 SEO高质 ...

  10. 使用ZXingObjC扫描二维码横竖屏对应

    /** 根据屏幕的方向设置扫描的方向 * @author maguang * @param parameter * @return result */ - (void)showaCapture { C ...