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替换的时候,效率高
posted @ 2021-06-17 15:56  DEJAVU_ERIC  阅读(20)  评论(0编辑  收藏  举报