Vue02

Vue指令补充

复制代码
<!-- 
    v-model.trim 去除文本前后的空格,只保留没有前后空格的文本内容
    v-model.number 将文本中可以转成number的字符串变成字符串
-->
复制代码
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            width: 200px;
            height: 200px;
            border: 3px solid black;
            font-size: 30px;
            margin-top: 10px;
        }
        .pink{
            background-color: pink;
        }
        .big{
            width: 300px;
            height: 300px;
        }
    </style>
</head>
<body>
    <div id="app">
    <div class="box" v-bind:class="{pink:true,big:false}" >
        盒子1
    </div>
    <div class="box" v-bind:class="['pink','big']">
        盒子2
    </div>
    </div>
</body>

v-bind导航栏菜单切换

复制代码
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
          margin: 0;
          padding: 0;
        }
        ul {
          display: flex;
          border-bottom: 2px solid #e01222;
          padding: 0 10px;
        }
        li {
          width: 100px;
          height: 50px;
          line-height: 50px;
          list-style: none;
          text-align: center;
        }
        li a {
          display: block;
          text-decoration: none;
          font-weight: bold;
          color: #333333;
        }
        li a.active {
          background-color: #e01222;
          color: #fff;
        }
    </style>
</head>
<body>
    <div id="app">
        <ul>
            <!-- @click单击事件里面可以动态去获取选中的下标 -->
            <!-- 高亮判定条件,当前列表项下标等于选中列表项的下标 -->
            <li v-for="(item,index) in list" :key="item.id" @mouseover="activeIndex=index">
                <a :class="{active:index===activeIndex}" href="">{{item.name}}</a>
            </li>
        </ul>
    </div>
</body>
<script src="js/vue.js"></script>
<script>
    const v = new Vue({
        el:"#app",
        data:{
        activeIndex:4,
            list:[
                {id:1,name:"京东秒杀"},
                {id:2,name:"每日特价"},
                {id:3,name:"品类秒杀"}
            ]
        }
    })
</script>

v-bind控制行内样式

v-model作用域其他表单上

复制代码
<!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">
    <h3>个人信息注册</h3>

    姓名:
      <input type="text" v-model="username"> 
      <br><br>
    是否单身:
      <input type="checkbox" v-model="isSingle"> 
      <br><br>

    <!-- 
      前置理解:
        1. name:  给单选框加上 name 属性 可以分组 → 同一组互相会互斥
        2. value: 给单选框加上 value 属性,用于提交给后台的数据
      结合 Vue 使用 → v-model
    -->
    性别: 
      <input v-model="gender" type="radio" name="sex" value="1">男
      <input v-model="gender" type="radio" name="sex" value="2">女
      <br><br>

    <!-- 
      前置理解:
        1. option 需要设置 value 值,提交给后台
        2. select 的 value 值,关联了选中的 option 的 value 值
      结合 Vue 使用 → v-model
    -->
    所在城市:
      <select v-model="cit">
        <option value="bj">北京</option>
        <option value="sh">上海</option>
        <option value="cd">成都</option>
        <option value="nj">南京</option>
      </select>
      <br><br>
    自我描述:
      <textarea v-model="desc"></textarea> 
    <button>立即注册</button>
  </div>
  <script src="js/vue.js"></script>
  <script>
    Vue.config.devtools = true;
    const app = new Vue({
      el: '#app',
      data: {
          username:'',
          isSingle: false,
          gender:1,
          city: '',
          desc:''
      }
    })
  </script>
</body>
</html>
复制代码
<!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">
        <h3>礼物清单</h3>
        <table>
            <tr>
                <td>名字</td>
                <td>数量</td>
            </tr>
            <tr v-for="(item,index) in list">
                <td>{{item.name}}</td>
                <td>{{item.num}}个</td>
            </tr>
        </table>
        <!-- 目标:统计总和,使用computed统计总数,使用函数名称一定不要带"()" -->
            <p>礼物总数:{{gettotalcount}}</p>
    </div>
</body>

<script src="js/vue.js"></script>
<script>    
    Vue.config.devtools = true;
    const v = new Vue({
        el:"#app",
        data:{
            list:[
                {id:1,name:"篮球",num:1},
                {id:2,name:"玩具",num:2},
                {id:3,name:"铅笔",num:5},
            ]
        },
        computed:{
            gettotalcount(){
                //定义计算逻辑,将list中的num取出进行累加
                return this.list.reduce((sum,item)=>sum + item.num,0)
            }
        }
    })
</script>
</html>

简而言之,methods的函数方法每次调用都会执行一次,computed会使用缓存,一次刷新最多执行一次

复制代码
<body>
  <div id="app">
    姓:<input type="text" v-model="firstName"><br>
    名:<input type="text" v-model="lastName"><br>
    <p>姓名:{{fullName}}</p>
    <button @click="changeName()">修改姓名</button>
  </div>
  <script src="js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        firstName: '',
        lastName:''
      },
      methods:{
        changeName(){
          this.fullName = "张小飞"
        }
      },
      computed: {
          //定义计算属性 获取结果
          /*  fullName(){
            return this.firstName + this.lastName
          }  */
          fullName:{
            get(){
              return this.firstName + this.lastName
            },
            set(value){
                this.firstName = value.slice(0,1);
                this.lastName = value.slice(1);
            }
          }
      }
    })
  </script>
</body>

set方法会在调用=时,将=后面的内容当作value传入

复制代码
<!DOCTYPE html>
<!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">
        监听简单的数据:<input type="text" v-model="username">
        监听对象的属性:<input type="text" v-model="user.name">
    </div>
</body>
<script src="js/vue.js"></script>
<script>
    Vue.config.devtools = true;
    const vue = new Vue({
        el:"#app",
        data:{
           username:'eric',
           user:{name:'kobe'}
        },
        watch:{
            //监听简单的数据
            username(newValue,oldValue){
                console.log('新值:',newValue,'旧值:',oldValue)
            },
            //监听对象的属性
            'user.name'(n1,n2){
                console.log('新值:',n1,'旧值:',n2)
            }
        }
    })
</script>
</html>
复制代码
<!DOCTYPE html>
<!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">
        监听简单的数据:<input type="text" v-model="username">
        监听对象的属性:<input type="text" v-model="user.name">
        深度监听:<input type="text" v-model="emp.empname">
        <input type="text" v-model="emp.address">
    </div>
</body>
<script src="js/vue.js"></script>
<script>
    Vue.config.devtools = true;
    const vue = new Vue({
        el:"#app",
        data:{
           username:'eric',
           user:{name:'kobe'},
           emp:{
            empname:"jass",address:"USA"
           }
        },
        computed:{
            newEmp(){
                return JSON.stringify(this.emp);
            }
        },
        watch:{
            //监听简单的数据
            username(newValue,oldValue){
                console.log('新值:',newValue,'旧值:',oldValue)
            },
            //监听对象的属性
            'user.name'(n1,n2){
                console.log('新值:',n1,'旧值:',n2)
            },
            //深度监听
            "newEmp":{
                handler(nv,ov){//nv:属性值发生变化的对象 ov:原来的值对应的对象
                    console.log("新:", JSON.stringify(nv),"旧:",JSON.stringify(ov));
                },            
                deep:true,  //开启深度监听
                immediate:true,   //开启立即监听
            }
        }
    })
</script>
</html>
相关推荐
lichenyang4536 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen6 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒6 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
free357 小时前
从 0 实现一个 Tiny JavaScript VM:项目架构拆解
javascript
奇奇怪怪的7 小时前
Embedding 模型 10+ 横向评测
前端
陈广亮7 小时前
Monorepo 从 0 到 1 实操指南 2026 版:pnpm catalogs + Turborepo 2.x + changesets 全链路
前端
子兮曰7 小时前
OpenMontage 深度解剖:你的 AI 编程助手,其实是个视频工作室
前端·后端·ai编程
敲代码的鱼7 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
子兮曰7 小时前
前端工具链的「Rust 化」:一场没有赢家的军备竞赛?
前端·后端·rust