第三天接触vue的心得

一、watch
  • 案例:百度搜索框
  • 接口:百度:http://suggestion.baidu.com/su?cb=callback&wd=123
1、深浅监听

注意:

  • 深监听只能获取到最新的数据,这种方式不推荐使用,如果需要使用,需要转为浅监听方式
  • 需要监听的方法名一定要与data中声明的属性名保持一致
<div id='app'>
        <input type="text" v-model='msg'>
       <div> {{msg}}</div>
       <hr>
       <input type="text" v-model='json.name'>
       <input type="text" v-model='b'>
       <div>{{json.name}}</div>
    </div>
let vm = new Vue({
        el: '#app',
        data: {
            msg:'hello',
            json:{
                name:'张三',
                age:20
            },
            b:''
        },
        methods: {
            // 可以通过这种方式进行深浅转换
            fn(){
                 var a = this.json.name
                 return a
            }
        },
        watch: {
            // 浅监听   基本数据类型
            msg(newVal,oldVal){
                console.log(newVal,oldVal)
           },
        //    这种方式监听不到数据
        //    json(newVal,oldVal){
        //         console.log(newVal,oldVal)
        //    }
            //深监听
           json:{
               handler(a){
                    console.log(a)
               },
               deep:true
           },
        //    监听b属性
           b(a,b){
                console.log(a)
           }

        },
        mounted() {
           console.log(this.fn())
           this.b = this.fn()
        },     
    })
2、百度案例
  • 跨域的解决 jsonp

  • 通过监听用户输入,发送请求,渲染页面

<body>
    <div id="app">
        <input type="text" v-model='search' @keydown.up.prevent='up' @keydown.down='down' @keydown.enter='enter'>
        <ul>
            <li v-for='(item,index) in arr' :key='item' :class='[index==n?"select":""]'>{{item}}</li>
        </ul>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let vm = new Vue({
            el: '#app',
            data: {
                search: "",
                arr: [],
                n: -1,
            },
            methods: {
                down() {
                    console.log('下');
                    this.n++;
                    if (this.n > this.arr.length - 1) {
                        this.n = 0
                    }
                },
                up() {
                    console.log(11);
                    this.n--;
                    if (this.n < 0) {
                        this.n = this.arr.length - 1
                    }
                },
                enter() {
                    //在下拉列表的范围内点击跳转到对应的搜索页面
                    if (this.n >= 0 && this.n >= this.arr.length - 1) {
                        window.open('https://www.baidu.com/s?wd=' + this.arr[this.n])
                    } else {
                        window.open('https://www.baidu.com/s?wd=' + this.search)
                    }
                }
            },
            watch: {
                search() {
                    if(this.search==''){
                        return
                    }
                    // 发送数据请求 jsonp方式
                    var os = document.createElement('script');
                    os.src = 'http://suggestion.baidu.com/su?cb=aa&wd=' + this.search;
                    document.body.appendChild(os)
                }
            }
        })
        function aa(res) {
            console.log(res);
            // 找到与vm中data的关系,并且赋值
            vm.arr = res.s
        }
    </script>
</body>
二、过滤器
  • 全局: Vue.fliter(‘过滤器名字’,回调函数) 回调函数中做的是业务逻辑

  • 局部:在vue实例中通过filters配置项来配置 filters:{ 过滤器名称(){ 业务逻辑} }

1.电话号码过滤
<body>
    <div id="app">
        {{tel|abc}}
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                tel: "13421212189",
            },
            filters: {
                abc: function (tel) {
                    return tel.slice(0, 3) + '****' + tel.slice(7)
                }
            }
        })
    </script>
</body>
2.过滤价格
 <div id='app'>
        <!-- | 管道符  -->
        {{price | filterPrice}}
    </div>
Vue.filter('filterPrice',(price)=>{
    return price.toFixed(2)
})
3.过滤时间
  • padStart 首位补零方法 padEnd 末尾补零

    let month = ((date.getMonth()+1)+’’).padStart(2,‘0’)

<div id='app'>
        <div>当前时间{{ time | filterTime}}</div>
    </div>
Vue.filter('filterTime',(time)=>{
    // padStart   首位补零方法  padEnd  末尾补零
    let date = new Date(time)
    console.log(date)
    // 年
    let year = date.getFullYear()
    // 月
    let month = ((date.getMonth()+1)+'').padStart(2,'0')
    // 日
    let day = (date.getDate()+'').padStart(2,'0')
    // 时
    let hours = (date.getHours()+'').padStart(2,'0')
    // 分
    let minutes = (date.getMinutes()+'').padStart(2,'0')
    // 秒
    let seconds = (date.getSeconds()+'').padStart(2,'0')
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
})
三、计算属性

1.通过计算得出来的,所以就没有初始值

  • computed:应用场景:购物车的总价 特点:多个数据影响一个数据

  • watch:应用场景 特点:一个数据影响多个数据

  • copmuted: 方法是不需要调用的,直接在页面使用即可

  • methods: 必须要调用的

<div id='app'>
        <table border="1" style="border-collapse:collapse" width='500'>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>分数</th>
                <th>操作</th>
            </tr>
            <tr v-for='(item,index) in list' :key='item.id'>
                <td>{{index+1}}</td>
                <td>{{item.name}}</td>
                <td>
                    <input type="number" v-model.number='item.score'>
                </td>
                <td>
                    <button>删除</button>
                </td>
            </tr>
           
            <tr v-if='list.length==0'>
                <td colspan="4">暂无数据</td>
            </tr>
            <tr v-else>
                <td colspan="4">平均分:{{avg}}</td>
            </tr>
        </table>
    </div>
let vm = new Vue({
        el: '#app',
        data: {
            list:[
                {id:1,name:'张三',score:80},
                {id:2,name:'李四',score:90},
                {id:3,name:'王五',score:60},
                {id:4,name:'赵六',score:87},
                {id:5,name:'王麻子',score:36},
            ]
        },
        methods: {
        },
        // 计算属性
        computed: {
            avg(){
                var sum=0;
                this.list.forEach(item=>{
                    sum+=item.score
                }) 
                return sum/this.list.length
            }
        },
    })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值