【Vue.js】之监听实现搜索功能与翻译功能

监听器(watch)

watch监听器的用法相当于是我们监视一个数据的变化,在这个数据变化时执行一些操作,这个操作可以是任何操作

声明:

watch: {
	要监听的属性: function (newValue, oldValue) {},
	要监听的属性: '函数名' // methods中的函数
	要监听的属性: {
        handler (newValue, oldValue) {
        	console.log('watch', newUser)
        }
    }
}

如果监听的属性是引用类型(对象/数组)时,默认不会监听引用类型内部数据的改变, 需要开启深度监听才能监听内部数据的改变

user: {
    handler (newUser) {
    	console.log('watch', newUser)
        if (newUser.username === 'admin') {
            this.usernameError = '账号已经注册'
        } else {
            this.usernameError = '可以使用'
        }
    },
    deep: true // 是否开启深度监听, 不推荐使用
}

推荐使用:

'user.username' (newValue) {
	console.log('watch', newValue)
}

数组的定义方式

'user.username': [
    'checkUserName1', // methods中的函数
    'checkUserName2',
    function (newValue) {
    	console.log('watch checkUserNam3', newValue)
    },
    {
        handler (newValue) {
            console.log('watch handler', newValue)
        }
    }
]

初始化时触发监听

msg: {
handler () {
	console.log('watch msg')
},
	immediate: true // 是否初始化时触发监听
},

利用监听实现搜索与翻译功能

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>实现搜索和百度翻译功能</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <style>
        input,
        textarea,
        select {
            outline: none;
        }
    </style>
</head>
<body>
    <div id="app">
        <h2>内容搜索</h2>
        <p>
            <input type="text" v-model.trim="word">
        </p>
        <ul>
            <li v-for="item of list" :key="item">{{item}}</li>
        </ul>

        <h2>百度翻译</h2>
        <select v-model="type">
            <option value="">请选择翻译方式</option>
            <option value="cte">汉译英</option>
            <option value="etc">英译汉</option>
        </select><br><br>
        <textarea v-model.trim="sentence"></textarea>
        <textarea>{{translate}}</textarea>
    </div>
</body>
<script>
    new Vue({
        el: '#app',
        data: {
            word: '',
            list: [],
            type: '',
            suffix: '',
            sentence: '',
            translate: ''
        },
        watch: {
            // 监听word的改变
            word() {
                // 只要word发生改变就调用接口
                // http://suggestion.baidu.com/su?cb=callback&wd=
                // 需要解决跨域问题
                // script调用外部链接时不会产生跨域问题, img , link
                // 解决跨域的方法: jsonp cors proxy

                // 使用原生js发送jsonp
                jsonp('http://suggestion.baidu.com/su?cb=callback&wd=' + this.word, 'callback',
                    (res) => {
                        // console.log(res)
                        this.list = res.s || []
                    })
            },
            type() {
                // console.log(this.type)
                let type = this.type
                switch (type) {
                    case 'cte':
                        this.suffix = '&to=en'
                        break;
                    case 'etc':
                        this.suffix = ''
                        break;
                    default:
                        this.suffix = ''
                }
            },
            // 监听要翻译的内容
            sentence() {

                // console.log(this.suffix)
                jsonp('https://api.asilu.com/fanyi?q=' + this.sentence + '&callback=callback' + this.suffix, 'callback',
                    (res) => {
                        // console.log(res)
                        this.translate = res.data || ''
                    })
            }
        }
    })

    function jsonp(url, cbName, handle) {
        // 1.创建script标签
        const jsonScript = document.createElement('script')
        // 2.设置src属性
        jsonScript.src = url
        // 3.把jsonScript添加到HTML中
        document.body.appendChild(jsonScript)
        // 4.定义callback函数
        window[cbName] = (res) => {
            // 把接口返回的数据传递到handle函数
            // console.log(res)
            handle && handle(res)
            // 5.删除jsonScript
        }
        document.body.removeChild(jsonScript)
    }
</script>
</html>
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值