1. 首页>
  2. 技术文章>
  3. vue3学习第8天

vue3学习第8天

10/22/23 10:26:13 AM 浏览 469 评论 0

vue

@click.prevent是一个事件修饰符的组合。它用于阻止默认的点击行为并执行特定的逻辑。

@click 是Vue模板语法中用于监听元素的点击事件的指令。当元素被点击时,相关的方法或表达式将会被执行。

.prevent 是一个事件修饰符,用于告诉Vue在触发点击事件后立即调用 event.preventDefault() 方法,阻止浏览器默认的行为。

举个例子,在下面的代码中,当连接被点击时,会执行 handleClick 方法,并且阻止默认的跳转行为,比如下面的demo:

<div id="app">
   <a @click.prevent="alert('hello')" href="http://www.52jiagou.com">连接</a>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@latest/dist/vue.js"></script>
<script>
    const app = new Vue({
        //element缩写
        el: '#app',
        methods:{
            alert(msg){
                alert(msg);
            }
        }    
    })
</script>

事件修饰符和类型的判断:

<div id="app">
    请输入分数:<input type="text" v-model.number="score" />
    <input type="button" @click="checkScore" value="确定" />
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@latest/dist/vue.js"></script>
<script>
    const app = new Vue({
        //element缩写
        el: '#app',
        data:{
            score:null
        },
        methods:{
            checkScore(){
               if(typeof this.score != "number"){
                    alert("请输入数字");
               }
            }
        }
     
    })
</script>

watch 侦听器,作用:监视数据变化,执行一些业务逻辑或异步操作。例子:

<div id="app">
    请输入:<input type="text" v-model="student.remark" />
    同步:<input type="text" v-model="remark2" />
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@latest/dist/vue.js"></script>
<script>
    const app = new Vue({
        //element缩写
        el: '#app',
        data:{
            remark2:"",
            student:{
                remark:""
            }
        },
        watch:{
            'student.remark' (newValue){
                this.remark2 = newValue;
            }
            //假设里面需要异步处理
            /* async 'student.remark' (newValue){
                const res = await axios({
                    url:'',
                    params:{}
                })
                console.log(res.data);
            } */
           
            //实现防抖,延迟执行
            /* clearTimeout(this.timer);
            this.timer = setTimeout(async () => {
                async 'student.remark' (newValue){
                    const res = await axios({
                        url:'',
                        params:{}
                    })
                    console.log(res.data);
                }
            }, 1000); */
           
        }
     
    })
</script>

watch完整写法:

watch:{
    数据属性名:{ //如果是想监控整个对象,写对象名
        deep:true,//深度监视
        immediate:true,//是否初始化的时候就马上执行一次
        handler(newValue){}
    }
}

every 是数组的一个内置方法,用于检查数组中的所有元素是否符合指定的条件。它会对数组中的每个元素依次执行指定的函数,只有当所有元素都满足条件时,才会返回 true;如果任何一个元素不满足条件,则返回 false。

在创建路由器实例时,history 配置允许我们在不同的历史模式中进行选择。

Hash 模式

hash 模式是用 createWebHashHistory() 创建的,它在内部传递的实际 URL 之前使用了一个哈希字符(#)。由于这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理。不过,它在 SEO 中确实有不好的影响。如果你担心这个问题,可以使用 HTML5 模式。

HTML5 模式

用 createWebHistory() 创建 HTML5 模式,推荐使用这个模式,当使用这种历史模式时,URL 会看起来很 "正常",例如 https://example.com/user/id。漂亮!

不过,问题来了。由于我们的应用是一个单页的客户端应用,如果没有适当的服务器配置,用户在浏览器中直接访问 https://example.com/user/id,就会得到一个 404 错误。这就尴尬了。

不用担心:要解决这个问题,你需要做的就是在你的服务器上添加一个简单的回退路由。如果 URL 不匹配任何静态资源,它应提供与你的应用程序中的 index.html 相同的页面。漂亮依旧!

location / {
  try_files $uri $uri/ /index.html;
}

v-model 和 v-bind 是 Vue 中两个常用的指令:

v-model 用于表单元素,实现双向数据绑定,同时监听用户输入和更新数据。

v-bind 用于绑定数据到 DOM 元素的属性或组件的属性,实现数据驱动视图的更新。

需要注意的是,v-model 实质上是 v-bind 和 v-on 的结合使用,简化了双向数据绑定的写法。在某些情况下,你也可以使用 v-bind 和 v-on 分别完成类似的功能。

demo:

<div id="app">
    <ul>
        <li v-for="(item,index) in list" :key="item.id">
            <input type="checkbox" v-model="item.checked" />{{item.name}}
        </li>
    </ul>
    全选<input type="checkbox" v-model="isAll" />
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@latest/dist/vue.js"></script>
<script>
    const app = new Vue({
        //element缩写
        el: '#app',
        data:{
            list:[
                {id:1,name:"小强",checked:true},
                {id:2,name:"小红",checked:false}
            ]
        },
        computed:{
            isAll : {
                get (){
                    return this.list.every(p => p.checked);
                },
                set (value){
                    console.log(value);
                    this.list.forEach(p => p.checked = value);
                }
            }
        }
     
    })
</script>


网友讨论