【深入学习Vue丨第二篇】构建动态Web应用的基础

前言

Vue模板语法是一种基于HTML的扩展语法,它允许开发者声明式地将数据绑定到DOM。与传统的字符串模板或JSX不同,Vue模板更接近原生HTML,学习曲线平缓,同时提供了强大的数据绑定和逻辑控制能力。

模板语法基础

文本插值

最基本的模板语法是"Mustache"语法(双大括号),用于数据绑定:

html 复制代码
<div id="app">
  <p>{{ message }}</p>
  <!-- 一次性插值 -->
  <span v-once>{{ message }}</span>
</div>
javascript 复制代码
new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

2. 原始HTML

双大括号会将数据解释为普通文本,如果要输出真正的HTML,需要使用v-html指令:

html 复制代码
<div id="app">
  <p>{{ rawHtml }}</p>
  <!-- 输出真正的HTML -->
  <p v-html="rawHtml"></p>
</div>
typescript 复制代码
new Vue({
  el: '#app',
  data: {
    rawHtml: '<span style="color: red">红色文字</span>'
  }
})

指令详解

指令是带有v-前缀的特殊属性,其值预期是单个JavaScript表达式

1. 条件渲染

html 复制代码
<div id="app">
  <!-- v-if 条件渲染 -->
  <p v-if="isVisible">你可以看到我</p>
  <p v-else>你看不到上面的内容</p>
  
  <!-- v-show 条件显示 -->
  <p v-show="isShow">我总是被渲染,只是可能不显示</p>
  
  <!-- 多个条件判断 -->
  <div>
    <p v-if="type === 'A'">类型A</p>
    <p v-else-if="type === 'B'">类型B</p>
    <p v-else>其他类型</p>
  </div>
</div>
javascript 复制代码
new Vue({
  el: '#app',
  data: {
    isVisible: true,
    isShow: false,
    type: 'A'
  }
})

v-if vs v-show:

  • v-if是真正的条件渲染,元素会被销毁和重建

  • v-show只是切换CSS的display属性

  • if有更高的切换开销,v-show有更高的初始渲染开销

2. 列表渲染

使用v-for指令基于数组或对象渲染列表:

html 复制代码
<div id="app">
  <!-- 数组渲染 -->
  <ul>
    <li v-for="(item, index) in items" :key="item.id">
      {{ index + 1 }}. {{ item.name }}
    </li>
  </ul>
  
  <!-- 对象渲染 -->
  <ul>
    <li v-for="(value, key, index) in userInfo">
      {{ index + 1 }}. {{ key }}: {{ value }}
    </li>
  </ul>
  
  <!-- 使用计算属性过滤列表 -->
  <ul>
    <li v-for="item in filteredItems" :key="item.id">
      {{ item.name }}
    </li>
  </ul>
</div>

3.事件处理

使用v-on指令(简写@)监听DOM事件:

html 复制代码
<div id="app">
  <!-- 直接执行方法 -->
  <button @click="sayHello">点击我</button>
  
  <!-- 内联JavaScript语句 -->
  <button @click="count++">计数: {{ count }}</button>
  
  <!-- 传递参数 -->
  <button @click="saySomething('Hello!')">打招呼</button>
  
  <!-- 访问原始DOM事件 -->
  <button @click="warn('表单不能提交', $event)">
    提交
  </button>
  
  <!-- 事件修饰符 -->
  <form @submit.prevent="onSubmit">
    <input type="text">
    <button type="submit">提交</button>
  </form>
  
  <!-- 按键修饰符 -->
  <input @keyup.enter="submitForm" placeholder="按回车提交">
</div>
html 复制代码
new Vue({
  el: '#app',
  data: {
    count: 0
  },
  methods: {
    sayHello() {
      alert('Hello!')
    },
    saySomething(message) {
      alert(message)
    },
    warn(message, event) {
      if (event) {
        event.preventDefault()
      }
      alert(message)
    },
    onSubmit() {
      alert('表单已提交')
    },
    submitForm() {
      alert('表单通过回车提交')
    }
  }
})

4. 表单输入绑定

使用v-model指令在表单元素上创建双向数据绑定:

html 复制代码
<div id="app">
  <!-- 文本输入 -->
  <input v-model="message" placeholder="编辑我">
  <p>输入的内容: {{ message }}</p>
  
  <!-- 多行文本 -->
  <textarea v-model="multilineText"></textarea>
  <p style="white-space: pre-line">{{ multilineText }}</p>
  
  <!-- 复选框 -->
  <input type="checkbox" id="checkbox" v-model="checked">
  <label for="checkbox">{{ checked }}</label>
  
  <!-- 多个复选框 -->
  <div>
    <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
    <label for="jack">Jack</label>
    <input type="checkbox" id="john" value="John" v-model="checkedNames">
    <label for="john">John</label>
    <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
    <label for="mike">Mike</label>
    <p>选中的人: {{ checkedNames }}</p>
  </div>
  
  <!-- 单选按钮 -->
  <div>
    <input type="radio" id="one" value="One" v-model="picked">
    <label for="one">One</label>
    <input type="radio" id="two" value="Two" v-model="picked">
    <label for="two">Two</label>
    <p>选中的值: {{ picked }}</p>
  </div>
  
  <!-- 选择框 -->
  <div>
    <select v-model="selected">
      <option disabled value="">请选择</option>
      <option>A</option>
      <option>B</option>
      <option>C</option>
    </select>
    <p>选中的值: {{ selected }}</p>
  </div>
</div>
html 复制代码
new Vue({
  el: '#app',
  data: {
    message: '',
    multilineText: '',
    checked: false,
    checkedNames: [],
    picked: '',
    selected: ''
  }
})

修饰符:

.lazy - 转为在change事件后同步

.number - 将输入值转为数值类型

.trim - 自动过滤输入的首尾空白字符

相关推荐
好奇龙猫3 小时前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(14):文法和单词-第三课
学习
程序定小飞3 小时前
基于springboot的web的音乐网站开发与设计
java·前端·数据库·vue.js·spring boot·后端·spring
Hello_WOAIAI3 小时前
2.4 python装饰器在 Web 框架和测试中的实战应用
开发语言·前端·python
仰望—星空3 小时前
MiniEngine学习笔记 : DescriptorHeap
windows·笔记·学习
FinClip3 小时前
凡泰极客亮相香港金融科技周,AI助力全球企业构建超级应用
前端
武昌库里写JAVA3 小时前
element-ui 2.x 及 vxe-table 2.x 使用 css 定制主题
java·vue.js·spring boot·sql·学习
阿四3 小时前
【Nextjs】为什么server action中在try/catch内写redirect操作会跳转失败?
前端·next.js
申阳3 小时前
Day 6:04. 基于Nuxt开发博客项目-LOGO生成以及ICON图标引入
前端·后端·程序员
中国lanwp4 小时前
npm中@your-company:registry 和 registry 的区别
前端·npm·node.js