zoukankan      html  css  js  c++  java
  • DAY 74 vue02

    1 属性指令
    -v-bind:href='变量/三目运算符/js代码'
       -:属性='变量'
    2 style和class
    -他俩也是属性,绑定变量也是使用属性指令
       -class可以绑定字符串,数组,对象
       -style:对象(横杠去掉,转成字母的大写)
       
    3 条件
    -v-if:如果符合这个条件,就会显示这个标签下的内容
       -v-else-if
       -v-else
    4 购物车的显示与不显示
    -v-if+v-for
    5 v-for的使用
    -循环数字,对象
       -index和value:反的
    6 事件处理
    -click
       -input:change,blur,input
       -过滤案例
    7阻止事件冒泡,a链接.html
    -click.self:只处理自己的事件,子控件冒泡的不处理
       -click.stop:阻止子事件的冒泡
       -prevent:阻止a连接的跳转
       -noce:只能点击一次

     

    1 按键修饰符

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

    </head>
    <body>

    <div id="app">
    <!--    <input type="text" @keyup.enter="handle" v-model="search">-->
    <!--    <input type="text" @keyup="handle" v-model="search">-->
       <input type="text" @keydown="handle" v-model="search">

    </div>
    </body>

    <script>

       var vm = new Vue({
           el: '#app',
           data: {
               search:''
          },
           methods: {
               handle(){
                   console.log('enter建被放开了')
                   location.href='https://www.baidu.com/s?wd='+this.search
              }
          }
      })
    </script>

    </html>

     

    2 数据双向绑定

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

    </head>
    <body>

    <div id="app">

       请输入您的名字:<input type="text" v-model="name">
       <hr>
       请输入您的密码:<input type="password" v-model="password"> <span>{{error}}</span>
       <hr>
       您输入的名字是:{{name}}

       <hr>
       <button @click="submit_1">登录</button>

    </div>
    </body>

    <script>

       var vm = new Vue({
           el: '#app',
           data: {
               name:'',
               password:'',
               error:''
          },
           methods:{
               submit_1(){
                   if(this.name=='lqz' && this.password=='123'){
                       location.href='http://www.baidu.com'
                  }else {
                       this.error='用户名或密码错误'
                  }
              }
          }

      })
    </script>

    </html>

     

    3 表单控制之单选

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

    </head>
    <body>

    <div id="app">

      请输入您的名字:<input type="text" v-model="name">
       <hr>
      请输入您的密码:<input type="password" v-model="password"> <span>{{error}}</span>
       <hr>
      记住密码: <input type="checkbox" v-model="check_1">
      记住密码: <input type="radio" v-model="radio_1" value="1">

       <hr>
       <button @click="submit_1">登录</button>

    </div>
    </body>

    <script>

       var vm = new Vue({
           el: '#app',
           data: {
               name:'',
               password:'',
               error:'',
               check_1:false,
               radio_1:false
          },
           methods:{
               submit_1(){
                   if(this.name=='lqz' && this.password=='123'){
                       location.href='http://www.baidu.com'
                  }else {
                       this.error='用户名或密码错误'
                  }
              }
          }

      })
    </script>

    </html>

     

    4 表单控制之多选

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

    </head>
    <body>

    <div id="app">

       请选择您的爱好
       <hr>
       <ul>
           <li v-for="hobby in hobbys">
               <!--           {{hobby}}<input type="checkbox" v-model="check_group" :value="index" >-->
              {{hobby.name}}<input type="checkbox" v-model="check_group" :value="hobby.name">
           </li>
       </ul>

       <hr>
      {{check_group}}

    </div>
    </body>

    <script>

       var vm = new Vue({
           el: '#app',
           data: {
               // hobbys:['篮球','足球','双色球','美女'],
               hobbys: [{id: 1, name: '篮球'}, {id: 2, name: '美女'}, {id: 3, name: '汉子'}],
               check_group: []
          },
           methods: {}

      })
    </script>

    </html>

     

    5 购物车案例

    5.1 基础

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Title</title>
       <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
       <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
       <div class="row">
           <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

               <div id="app">

                   <table class="table">
                       <tr>
                           <td>商品名称</td>
                           <td>商品价格</td>
                           <td>商品数量</td>
                           <td>选择</td>
                       </tr>

                       <tr v-for="good in goods">
                           <td>{{good.name}}</td>
                           <td>{{good.price}}</td>
                           <td>{{good.count}}</td>
                           <td><input type="checkbox" v-model="checkGroup" :value="good" @change="sum_price"></td>

                       </tr>

                   </table>
                  选中的商品是:{{checkGroup}}
                   <hr>
                  总价格:{{sum_price()}}

               </div>
           </div>
       </div>
    </div>

    </body>

    <script>

       var vm = new Vue({
           el: '#app',
           data: {

               goods: [{id: 1, name: '金瓶没', price: 16, count: 2}, {id: 2, name: '包子', price: 3, count: 4}, {
                   id: 3,
                   name: '啤酒',
                   price: 5,
                   count: 5
              }, {id: 4, name: '烧鸡', price: 30, count: 1}],
               checkGroup: [],
               // totalPrice: 0
          },
           methods: {
               // sum_price(){
               //     this.totalPrice=0
               //     // for (i=0;i<this.checkGroup.length;i++){
               //     for (i in this.checkGroup){
               //         this.totalPrice+=this.checkGroup[i].price*this.checkGroup[i].count
               //
               //     }
               //
               // }

               // 函数内使用的vue中的变量,只要发生变化,函数会重新运算
               sum_price() {
                   let totalPrice = 0
                   // for (i=0;i<this.checkGroup.length;i++){
                   for (i in this.checkGroup) {  //i是索引
                       totalPrice += this.checkGroup[i].price * this.checkGroup[i].count

                  }
                   return totalPrice

              }
          }

      })
    </script>

    </html>

     

    5.2 带全选,全不选

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Title</title>
       <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
       <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
       <div class="row">
           <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

               <div id="app">

                   <table class="table">
                       <tr>
                           <td>商品名称</td>
                           <td>商品价格</td>
                           <td>商品数量</td>
                           <td>
                              全选/不全选
                               <input type="checkbox" v-model="checkAll" @change="handleCheckALl">
                           </td>
                       </tr>

                       <tr v-for="good in goods">
                           <td>{{good.name}}</td>
                           <td>{{good.price}}</td>
                           <td>{{good.count}}</td>
                           <td><input type="checkbox" v-model="checkGroup" :value="good" @change="checkOne"></td>

                       </tr>

                   </table>
                  选中的商品是:{{checkGroup}}
                   <hr>
                  总价格:{{sum_price()}}

               </div>
           </div>
       </div>
    </div>

    </body>

    <script>

       var vm = new Vue({
           el: '#app',
           data: {

               goods: [{id: 1, name: '金瓶没', price: 16, count: 2}, {id: 2, name: '包子', price: 3, count: 4}, {
                   id: 3,
                   name: '啤酒',
                   price: 5,
                   count: 5
              }, {id: 4, name: '烧鸡', price: 30, count: 1}],
               checkGroup: [],
               checkAll: false
          },
           methods: {

               sum_price() {
                   let totalPrice = 0
                   for (i in this.checkGroup) {  //i是索引
                       totalPrice += this.checkGroup[i].price * this.checkGroup[i].count

                  }
                   return totalPrice

              },
               handleCheckALl() {

                   if (this.checkGroup.length == this.goods.length) {
                       this.checkGroup = []
                       this.checkAll = false
                  } else {
                       this.checkGroup = this.goods
                       this.checkAll = true
                  }

              },
               checkOne(){
                   if (this.checkGroup.length != this.goods.length) {
                       this.checkAll = false
                  }else {
                       this.checkAll = true
                  }

              }
          }

      })
    </script>

    </html>

     

    5.3 带加减

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Title</title>
       <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
       <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
       <div class="row">
           <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

               <div id="app">

                   <table class="table">
                       <tr>
                           <td>商品名称</td>
                           <td>商品价格</td>
                           <td>商品数量</td>
                           <td>
                              全选/不全选
                               <input type="checkbox" v-model="checkAll" @change="handleCheckALl">
                           </td>
                       </tr>

                       <tr v-for="good in goods">
                           <td>{{good.name}}</td>
                           <td>{{good.price}}</td>
                           <td>
                               <button @click="good.count++">+</button>
                              {{good.count}}
                               <button @click="handle_j(good)">-</button>
                           </td>
                           <td><input type="checkbox" v-model="checkGroup" :value="good" @change="checkOne"></td>

                       </tr>

                   </table>
                  选中的商品是:{{checkGroup}}
                   <hr>
                  总价格:{{sum_price()}}

               </div>
           </div>
       </div>
    </div>

    </body>

    <script>

       var vm = new Vue({
           el: '#app',
           data: {

               goods: [{id: 1, name: '金瓶没', price: 16, count: 2}, {id: 2, name: '包子', price: 3, count: 4}, {
                   id: 3,
                   name: '啤酒',
                   price: 5,
                   count: 5
              }, {id: 4, name: '烧鸡', price: 30, count: 1}],
               checkGroup: [],
               checkAll: false
          },
           methods: {

               sum_price() {
                   let totalPrice = 0
                   for (i in this.checkGroup) {  //i是索引
                       totalPrice += this.checkGroup[i].price * this.checkGroup[i].count

                  }
                   return totalPrice

              },
               handleCheckALl() {

                   if (this.checkGroup.length == this.goods.length) {
                       this.checkGroup = []
                       this.checkAll = false
                  } else {
                       this.checkGroup = this.goods
                       this.checkAll = true
                  }

              },
               checkOne() {
                   if (this.checkGroup.length != this.goods.length) {
                       this.checkAll = false
                  } else {
                       this.checkAll = true
                  }

              },
               handle_j(good) {
                   if (good.count == 1) {
                       good.count == 1
                  } else {
                       good.count--
                  }
              }
          }

      })
    </script>

    </html>

    v-model

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

    <div id="app">
    <!-- 用户名 <input type="text" v-model.lazy="name">-->
    <!-- 用户名 <input type="text" v-model.number="name">-->
    用户名 <input type="text" v-model.trim="name">
    <hr>
    {{name}}
    </div>
    </div>
    </div>
    </div>

    </body>

    <script>

    var vm = new Vue({
    el: '#app',
    data: {
    name:''
    },
    methods: {}

    })
    </script>

    </html>

    lazy:等待input框的数据绑定时区焦点之后再变化
    number:数字开头,只保留数字,后面的字母不保留;字母开头,都保留
    trim:去除首位的空格

     

    6 Vue生命期钩子

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

    <div id="app">
    {{name}}
    </div>
    </div>
    </div>
    </div>

    </body>

    <script>

    var vm = new Vue({
    el: '#app',
    data: {
    name:'lqz'
    },
    methods: {},

    beforeCreate() {
    console.log('当前状态:beforeCreate')

    },
    created() {
    console.log('当前状态:created')

    },
    beforeMount() {
    console.log('当前状态:beforeMount')

    },
    mounted() {
    console.log('当前状态:mounted')

    //用的最多,向后端加载数据,创建定时器等
    //挂在,三秒后执行一个任务

    // setTimeout(()=> {
    // console.log('lqz is nb')
    // },3000)
    this.t = setInterval(function () {
    console.log('lqz is nb')
    }, 3000)

    },
    beforeUpdate() {
    console.log('当前状态:beforeUpdate')

    },
    updated() {
    console.log('当前状态:updated')

    },
    beforeDestroy() {
    console.log('当前状态:beforeDestroy')

    },
    destroyed() {
    console.log('当前状态:destroyed')
    clearInterval(this.t)
    this.t = null
    console.log('destoryed')

    },

    })
    </script>

    </html>

     

    7 前后端交互之jq

    前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

    <div id="app">
    <button @click="handle_load">点我加载数据</button>
    <hr>
    拿回来的数据是:{{name}}
    </div>
    </div>
    </div>
    </div>

    </body>

    <script>

    var vm = new Vue({
    el: '#app',
    data: {
    name:'lqz'
    },
    methods: {
    handle_load(){
    $.ajax({
    url:'http://127.0.0.1:5000/',
    type:'get',
    success:data=> {
    this.name=data
    }
    })

    }
    },


    mounted() {
    //跟后端交互,写在这,而不要使用button
    console.log('当前状态:mounted')
    this.handle_load()


    },


    })
    </script>

    </html>

    后端

    from flask import Flask, make_response

    app = Flask(__name__)


    @app.route('/')
    def index():
    res = make_response('hello world')
    # 运行所有域向我发请求(解决跨域问题)
    res.headers['Access-Control-Allow-Origin']='*'
    return res


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

    8 前后端交互之fetch

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

    <div id="app">
    <ul>
    <li v-for="film in films_list">
    <img :src="film.poster" alt="" width="60px" height="80px">
    <span>{{film.name}}</span>
    <hr>
    </li>
    </ul>
    </div>
    </div>
    </div>
    </div>

    </body>

    <script>

    var vm = new Vue({
    el: '#app',
    data: {
    films_list: []
    },
    methods: {
    handle_load() {
    fetch('http://127.0.0.1:5000/home').then(data => data.json()).then(data => {
    console.log(data)
    if (data.status == 0) {
    this.films_list = data.data.films
    } else {
    alert('加载出错')
    }


    })

    }
    },


    mounted() {
    //跟后端交互,写在这,而不要使用button
    console.log('当前状态:mounted')
    this.handle_load()


    },


    })
    </script>

    </html>

     

    9 前后端交互之axios

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

    <div id="app">
    <ul>
    <li v-for="film in films_list">
    <img :src="film.poster" alt="" width="60px" height="80px">
    <span>{{film.name}}</span>
    <hr>
    </li>
    </ul>
    </div>
    </div>
    </div>
    </div>

    </body>

    <script>

    var vm = new Vue({
    el: '#app',
    data: {
    films_list: []
    },
    methods: {
    handle_load() {
    axios.get('http://127.0.0.1:5000/home').then(data => {
    //data.data才是后端响应的数据
    console.log(data)
    if (data.data.status == 0) {
    this.films_list = data.data.data.films
    } else {
    alert('加载出错')
    }
    })

    }
    },


    mounted() {
    //跟后端交互,写在这,而不要使用button
    console.log('当前状态:mounted')
    this.handle_load()


    },


    })
    </script>

    </html>

    10 计算属性

    把输入的首字母大写

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

    <div id="app">
    {{name}}

    <input type="text" v-model="s">
    <hr>
    输入的值是:{{s.slice(0,1).toUpperCase()+s.slice(1)}}
    <hr>
    输入的值是:{{to_upper()}}
    <hr>
    输入的值是(计算属性) :{{str_s}}
    </div>
    </div>
    </div>
    </div>

    </body>

    <script>

    var vm = new Vue({
    el: '#app',
    data: {
    s:'',
    name:''
    },

    computed:{
    str_s(){
    //只有该方法中使用的值发生变化,才会重新计算
    console.log('计算属性的方法,我执行了')
    return this.s.slice(0,1).toUpperCase()+this.s.slice(1)
    }
    },
    methods:{
    to_upper(){
    console.log('我执行了')
    return this.s.slice(0,1).toUpperCase()+this.s.slice(1)
    }
    },





    })
    </script>

    </html>

    重写过滤案例

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <script src="./js/vue.js"></script>

    </head>
    <body>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">

    <div id="app">
    <p><input type="text" v-model="mytext" @input="handleChange"></p>
    <ul>
    <li v-for="data in newdatalist">{{data}}</li>
    </ul>
    </div>
    </div>
    </div>
    </div>

    </body>

    <script>

    var vm = new Vue({
    el: '#app',
    data: {
    mytext: '',
    datalist: ['aaa', 'abc', 'abcde', 'abcdef', 'bbb', 'bac'],
    },

    computed: {
    newdatalist() {
    var newlist = this.datalist.filter(item => {
    return item.indexOf(this.mytext) > -1
    })
    return newlist
    }

    },


    })
    </script>

    </html>

     

    11 虚拟dom优化问题

    1 v-for循环的时候,经常看到有个自定义属性 key

    2 key是一个唯一值,为了虚拟dom替换的时候,效率高
  • 相关阅读:
    实现货币金额中文大写转换的程序
    大数阶乘的计算(三)
    全国15亿人口中选1000个代表有多少种选法?
    DB Query Analyzer 中断SQL语句的执行
    Android_Preference存取数据
    Centos 学习笔记软件包管理
    Centos学习笔记文件搜索命令
    《计算机时代》2011年第12期刊登出《DB Query Analyzer中断SQL语句的执行》
    Centos学习笔记linux用户管理
    Centos学习笔记 linux 常用命令:压缩解压命令
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14893835.html
Copyright © 2011-2022 走看看