Skip to content

Vue

引入Vue

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

具体结构

页面结构

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">

    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

    <script>
    </script>
</body>
</html>

插值表达式

 
 插值表达是Vue的模板语法
 
插值表达式案例
    <div id="app">
        {{ msg}} 
        他是{{ age >= 18 ? '成年' : '未成年'}}
    </div>
作用:利用表达式进行插值,渲染到页面中
表达式: 可求值的代码,JS引擎将其计算并得出结果
注意点:
1.使用的数据必须存在
2.支持的是表达式而不是语句,类似if或者for之类
3.不能在标签属性中使用  插值,例如 
<p title="{{username}}"></p>

响应式特性

 Vue的核心特性就是响应式,即数据变化时,视图自动更新

 例如我们创造一个实例叫做data,其中有属性是name,data.name = '张三'
 访问数据  data.name
 修改数据  data.name = '李四'

Vue开发者工具

Vue 指令

Vue会根据不同指令针对标签实现不同功能
 常用指令:
 v-html/v-show/v-if/v-else/v-on/v-bind/v-for/v-model

v-html 可以动态设置元素 innnerHTML

v-html
<!-- Vue指令: v- 前缀的标签属性-->
<div v-html='str'> </div>

v-show v-if

v-show
1.作用;控制元素显示隐藏
2.使用: v-show = "表达式"
3.原理:切换 dispaly:none
4.场景:频繁切换显示隐藏
v-if
1.作用;控制元素显示隐藏(条件渲染)
2.使用: v-if = "表达式"
3.原理: 基于条件判断,是否创建或移除元素节点
4.场景:要么显示,要么隐藏,不频繁切换的场景

v-else / v-else-if

v-else
1.作用;辅助v-if进行判断渲染
2.使用: v-else v-else-if = "表达式"
3.注意: 需要紧挨v-if使用

v-on

v-on
1.作用;注册事件 = 添加监听及提供处理逻辑
2.使用: 
    v-on: 事件名="内联语句"  
    v-on: 事件名="methods中的函数名"
3.简写: @事件名
4.methods中函数内的this指向vue实例
<button v-on:click="count++">按钮</button>
<button @click="count++">按钮</button>
v-on
 const app = new Vue({
            el:'#app',
            methods:{
                fn(){
                    console.log('这是一个fn函数')
                }
            }
 })

注意事项

在methods,computed,watch灯选项的函数中
    必须用 this.属性名访问data里面的变量
    只有在模板指令中,才能直接写属性名
 

v-bind

1.作用:动态设置html的标签属性,例如src url title
2.语法:v-bind:属性名="表达式"
3.注意:简写为  :属性名="表达式"

v-for

1. 基于数据循环,多次渲染整个元素,包括数组,对象,数字之类
2. 遍历数组语法:
    v-for = "(item,index) in 数组"
    item 是每一项,index下标
案例
        <p v-for="(book,index) in booksList" :key=""book.id>· {{book.name}} {{book.author}}
            <button @click="deleteBook(book.id)">删除</button>
        </p> 
    
     booksList:[
                    {id:1,name:"《红楼梦》",author:"曹雪芹"},
                    {id:2,name:"《西游记》",author:"吴承恩"},
                    {id:3,name:"《水浒传》",author:"施耐庵"},
                    {id:4,name:"《三国演义》",author:"罗贯中"},
                ]

基本渲染 v-for/ 删除功能 filter

删除方法
        <div> 小黑的书架</div>
        <p v-for="(book,index) in booksList" :key=""book.id>· {{book.name}} {{book.author}}
            <button @click="deleteBook(book.id)">删除</button>
        </p> 
        // 这里为每个渲染出的元素绑定了key ,也就是book.id
        //然后将其传入click,由methods方法删除,不要忘了methods中的数据要加this
  deleteBook(bookId){
                    this.booksList = this.booksList.filter(book =>book.id !== bookId)
                }
key作用:
    给元素添加唯一标识,用于vue进行列表项的正确排序复用
注意点:
1.key值只能是字符串或数字类型
2.key的值必须具有唯一性
3.推荐用id 作为key,而不是index,因为index会变化,不对应

v-model

1.作用: 给表单元素使用,双向数据绑定,可以快速获取或者设置表单元素内容
  数据变化-》视图自动更新
  视图变化-》数据自动更新
2.语法: v-model="变量"

指令修饰符

1.按键修饰符
    @keyup.enter    键盘回车监听
2.v-model修饰符
    v-model.trim  去除首尾空格
    v-model.number  转数字
3.事件修饰符
    @事件名.stop  阻止冒泡
    @事件名.prevent  阻止默认行为

指令补充 v-bind

为了方便开发者进行样式控制,vue扩展了v-bind的语法
可以针对class类名和style行内样式进行控制
操作class 
对象:
    :class ="{类名1:布尔值,类名2:布尔值}"  为true就是有这个类
    适用类型是一个类名来回切换
数组:
    :class="[类名1,类名2,类名3]"
    使用场景是批量添加或删除类

案例:京东秒杀tab导航高亮

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
        <style>
        /* 给根容器加class(原id是app,建议统一用class,也可以用#app) */
        #app {
            box-sizing: border-box;
            display: flex;
            /* 可选:让子元素横向排列并换行,避免溢出 */
            flex-direction: row;
            flex-wrap: wrap;
            /* 可选:子元素之间加间距 */
            gap: 20px;
            /* 可选:内边距,让内容不贴边 */
            padding: 10px;
        }
        .box {
            box-sizing: border-box; /* 关键:边框不撑大盒子 */
            display: flex;
            /* 核心:红色下边框(可调整宽度/样式) */
            border-bottom: 2px solid red;
            /* 可选:内边距,让文字和边框有间距 */
            padding: 8px 12px;
            /* 可选:垂直居中文字(flex特性) */
            align-items: center;
        }
        .box.active {
            border-bottom: 2px solid red;
            color: red;
            font-weight: bold; /* 可选:高亮时文字加粗 */
        }
    </style>
</head>

<body>
    <div id="app" >
        <div 
        class="box"
        :key="item.id"  //绑定id
        :class="{active: activeTabId === item.id}" //高亮对应id的盒子 
        v-for="item of lists" //循环
        @click="activeTabId = item.id" //点击事件,被点击后将该盒id设为高亮id
         >{{item.name}}</div>





    </div>

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const app = new Vue({
        el: '#app',
        data:{
            lists:[
                {id:1,name:'京东秒杀'},
                {id:2,name:'每日特价'},
                {id:3,name:'品类秒杀'}
            ],
            activeTabId:1,

        },    
    
    })
      </script>
</body>
</html>

v-model应用于其他表单元素

常见表单元素可用v-model绑定关联
可以快速获取或者设置表单元素的值
其会根据控件类型自动选取正确方法来更新元素

Check out the documentation for the full list of runtime APIs.

最近更新