zoukankan      html  css  js  c++  java
  • vue框架之前后端交互等相关内容-112

    0 购物车案例

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <script src="js/vue.js"></script>
       <title>Title</title>
    </head>
    <body>

    <div id="box">

       <input type="checkbox" v-model="isAll" @change="handleCheck"> 全选/全不选

       <div></div>
       <ul>
           <!--<li v-for="item in datalist">商品名字:{{item.name}},商品数量:{{item.number}}</li>-->
           <li v-for="item in datalist">
               <input type="checkbox" :value="item" v-model="checkgroup" @change="handleOne">
              {{item}}
               <button @click="item.number++">增</button>
              {{item.number}}
               <button @click="handleJ(item)">减</button>
           </li>
       </ul>
       <br>
      当前价格是:{{getPrice()}}
       <br>
      {{checkgroup}}
    </div>

    </body>
    <script>
       var vm = new Vue({
           el: '#box',
           data: {
               datalist: [
                  {name: '特斯拉', price: 10, number: 1, id: '1'},
                  {name: '苹果', price: 3, number: 4, id: '2'},
                  {name: '香蕉', price: 80, number: 6, id: '3'}
              ],
               checkgroup: [],
               isAll:false,

          },
           methods:{
               getPrice(){
                   var sum_price=0
                   for(i in this.checkgroup){
                       sum_price+=this.checkgroup[i]['number']*this.checkgroup[i]['price']
                  }
                   return sum_price

              },
               handleCheck(){
                   // console.log('xxx')
                   if(this.checkgroup.length>0){
                       this.checkgroup=[]
                  }else {
                       this.checkgroup=this.datalist
                  }
              },
               handleOne(){
                   console.log('选中',this.checkgroup.length)
                   console.log('总数据',this.datalist.length)
                   if(this.checkgroup.length==this.datalist.length){
                       this.isAll=true
                  }else {
                       this.isAll=false
                  }
              },
               handleJ(item){
                   if(item.number<=1){
                       alert('不能再少了')
                       item.number=1
                  }else {
                       item.number--
                  }
              }
          }
      })
    </script>
    </html>

    1 v-model之lazy,number,trim

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <script src="js/vue.js"></script>
       <title>Title</title>
    </head>
    <body>
    <div id="box">
       <input type="text" v-model.lazy="mytext">||{{mytext}}
       <br>
       <input type="number" v-model.number="mynumber">||{{mynumber}}
       <br>
       <input type="text" v-model.trim="mytrim">||{{mytrim}}||
    </div>
    </body>
    <script>
       var vm = new Vue({
           el: '#box',
           data: {
              mytext:'',
              mynumber:'',
              mytrim:'',

          },
      })
    </script>

    </html>

     

    2 fetch

    1 vue项目跟后端交互,可以使用ajax

    2.1 通过jq的ajax实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
       <script src="js/vue.js"></script>
       <title>Title</title>
    </head>
    <body>

    <div id="box">
      <button @click="handleClick">点我加载美女数据</button>
      美女你好:{{mytext}}
    </div>
    </body>
    <script>
       var myajax=$
       var vm = new Vue({
           el: '#box',
           data: {
               mytext:'',
          },
           methods:{
               handleClick(){
                   myajax.ajax({
                       url:'http://127.0.0.1:5000/',
                       method:'get',
                       success: (data)=> {
                           console.log(data)
                           this.mytext=data
                      }
                  })
              }
          }

      })
    </script>
    </html>
    from flask import Flask,make_response
    app=Flask(__name__)
    @app.route('/')
    def index():
       print('请求来了')
       res=make_response('hello world')
       res.headers['Access-Control-Allow-Origin'] = '*'
       return res
    if __name__ == '__main__':
       app.run()

    2.2 fetche向后端发送请求

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <script src="js/vue.js"></script>
       <title>Title</title>
    </head>
    <body>
    <div id="box">
       <button @click="handleClick">点我加载美女数据</button>
      从后端加载的数据:
       <br>
      用户名:{{name}}
       <br>
      年龄:{{age}}
    </div>
    </body>
    <script>
       var vm = new Vue({
           el: '#box',
           data: {
               name: '',
               age:''
          },
           methods: {
               handleClick() {
                   fetch('http://127.0.0.1:5000/').then(response => {
                       return response.json()
                  }).then(json => {
                       console.log('从后端获取的json数据', json)
                       this.name=json.name
                       this.age=json.age

                  }).catch(ex => {
                       console.log('出异常', ex)
                  })
              }
          }
      })
    </script>

    </html>
    from flask import Flask,make_response,jsonify
    app=Flask(__name__)

    @app.route('/')
    def index():
       res=jsonify({'name':'lqz','age':18})
       # 这两行代码处理跨域
       res=make_response(res)
       res.headers['Access-Control-Allow-Origin'] = '*'
       return res
    if __name__ == '__main__':
       app.run()

    3 axios

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <script src="js/vue.js"></script>
       <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
       <title>Title</title>
    </head>
    <body>
    <div id="box">
       <button @click="handleClick">点我加载电影数据</button>
       <ul>
           <li v-for="item in datalist">
               <p>电影名:{{item.name}}</p>
               <p>导演:{{item.director}}</p>
               <img :src="item.poster">
           </li>
       </ul>

    </div>

    </body>
    <script>
       var vm = new Vue({
           el: '#box',
           data: {
               datalist:[],
          },
           methods: {
               handleClick() {
                    axios.get("http://127.0.0.1:5000/film").then(res=>{
                       console.log(res.data)
                        if(res.data.status==0){
                           this.datalist=res.data.data.films
                        }
                  })

              }
          }

      })
    </script>

    </html>
    from flask import Flask, make_response, jsonify
    import json
    app = Flask(__name__)

    @app.route('/film')
    def film():
       with open('film.json', 'rt', encoding='utf-8') as f:
           dic = json.load(f)
       res = jsonify(dic)

       # 这两行代码处理跨域
       res = make_response(res)
       res.headers['Access-Control-Allow-Origin'] = '*'
       return res

    if __name__ == '__main__':
       app.run()

    4 计算属性

    4.1 通过计算属性来实现人名首字母大写

    1 直接再{{}}中写js代码       html中尽量少写jsdiamond
    2 使用函数 {{函数()}}       使用多次会执行多次
    3 使用计算属性               当作变量来使用,多次使用只会执行一次

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <script src="js/vue.js"></script>
       <title>Title</title>
    </head>
    <body>

    <div id="box">
       <p>{{name}}</p>
       <p>{{name.substring(0,1).toUpperCase()+name.substring(1)}}</p>
       <!--    <p>{{upperName()}}</p>-->
       <!--    <p>{{upperName()}}</p>-->
       <!--    <p>{{upperName()}}</p>-->

       <p>{{getName}}</p>
       <p>{{getName}}</p>
       <p>{{getName}}</p>
       <p>{{getName}}</p>
    </div>

    </body>
    <script>
       var vm = new Vue({
           el: '#box',
           data: {
               name: 'asdfasdf'
          },
           methods: {
               upperName() {
                   console.log('我执行了')
                   return this.name.substring(0, 1).toUpperCase() + this.name.substring(1)
              }
          },
           computed: {
               getName() {
                   console.log('我执行了')
                   return this.name.substring(0, 1).toUpperCase() + this.name.substring(1)
              },
          }

      })
    </script>

    </html>

     

    4.2 通过计算属性重写过滤小案例

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <script src="js/vue.js"></script>
       <title>Title</title>
    </head>
    <body>

    <div id="box">
       <input type="text" v-model="myinput" @input="handleChange">   {{myinput}}
       <br>
       <div>
           <p v-for="data in new_arr">{{data}}</p>
       </div>
    </div>

    </body>
    <script>
       var vm = new Vue({
           el: '#box',
           data: {
               myinput:'',
               arr: ['aabbc', 'abc', 'aabcd','ccdd','bbcc'],
          },
           computed:{
               new_arr(){
                   return this.arr.filter(item=>{
                       return item.indexOf(this.myinput) >-1
                  })
              }
          }

      })

    </script>
    </html>

     

    5 虚拟dom与diff算法 key的作用

    1 vue有虚拟dom,跟真实dom做替换,使用的算法是diff算法
    2 几种方案
    -分层级比较
       -同key值比较(循环中尽量加key)
       -组件或标签的比较去替换

     

    6 组件化开发基础

    1 组件是什么
    扩展 HTML 元素,封装可重用的代码,目的是复用
    -例如:有一个轮播,可以在很多页面中使用,一个轮播有js,css,html
    -组件把js,css,html放到一起,有逻辑,有样式,有html
    2 分类
    -全局组件
       -局部组件
    3 工程化以后
    一个组件就是一个  xx.vue
       
    4 element ui 其实就是写了一堆好看的组件,以后我们直接拿过来用就可以了

     

    6.1 定义全局组件并使用

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <script src="js/vue.js"></script>
       <title>Title</title>
    </head>
    <body>

    <div id="box">

       <div @click="handleClick">我是根组件的div</div>
       <child></child>
       <ul>
           <li v-for="i in 4">{{i}}</li>
       </ul>
       <div>
           <child></child>
       </div>



    </div>


    </body>
    <script>
       //创建组件对象(全局组件)
       Vue.component('child', {
           template: `
               <div>
                   <div style="background: red" @click="handleClick">我是头部</div>
                   <div v-if="isShow">显示消失</div>
               </div>
           `,
           methods:{
               handleClick(){
                   console.log('我被点击了')
                   this.isShow=!this.isShow
              }
          },
           data(){
               return {
                   isShow:true
              }
          },
      })
       var vm = new Vue({
           el: '#box',
           data: {
               isShow:true,
          },
           methods:{
                 handleClick(){
                   console.log('根组件我被点击了')
              }
          }

      })


    </script>
    </html>
  • 相关阅读:
    java 多线程小记
    Java通过反射实现实例化
    selenium webdriver 屏幕滚动
    selenium webdriver 实现百度贴吧自动签到
    selenium webdriver 小计
    JaveWeb 公司项目(7)----- 通过JS动态生成DIV
    两个DIV并排显示
    Intellij idea注册码失效
    JaveWeb 公司项目(6)----- 通过ToolTip给控件添加动态注释
    Intellij idea 添加浏览器
  • 原文地址:https://www.cnblogs.com/usherwang/p/14145993.html
Copyright © 2011-2022 走看看