发布于 2026-01-06 1 阅读
0

Vue入门

Vue入门

Vue.js 是一个由 Evan You 于 2014 年创建的渐进式框架,它允许你构建用户界面。如果你有 React 的背景,学习 Vue 会很容易,因为概念基本相同。但如果你习惯了纯 JavaScript 或 jQuery,那么 Vue 的学习体验将会截然不同!

确实,管理应用程序的状态很麻烦。Vue 通过为应用程序引入响应式特性来解决这个问题。这意味着什么呢?简单来说,每当应用程序发生更改时,UI 都会自动更新。此外,你还可以将应用程序拆分成称为组件的代码块。组件的优势在于易于创建、组合和重用。

声明式渲染和第一个指令:v-bind

Vue 的一大优势在于能够以简单的方式将数据渲染到 DOM(文档对象模型)中。以下是使用 Vue 实现响应式数据的第一个示例:

<div id="app">
  <p>My name is {{ name }}</p>
</div>
Enter fullscreen mode Exit fullscreen mode
new Vue({
  el: "#app",
  data: {
    name: "James Bond",
  },
});
Enter fullscreen mode Exit fullscreen mode

哇。这里发生了什么?这是什么data?这些都是很合理的{{ name }}问题el,我会马上回答。

查看 JavaScript 代码,可以看到我们创建了一个新的 Vue 实例(new Vue)。我们使用 `mount` 属性指定了该实例的挂载位置el,也就是说,在 ` div<div> id` 标签中#app。最后,我们data向该实例提供了一个对象。我们设置了一个 ` namevalue` 属性,其值为 `<div>` James Bond

返回 HTML 文件。您可以看到一个p包含 `<script>` 标签的元素My name is {{ name }}。通过使用这两个双括号,您告诉 Vue:

“你看到数据中的这个 name 属性了吗?请把它的值填入这些括号里!”

奇迹发生了。Vue 在幕后做了很多工作,让你的数据具有响应式特性。这意味着,无论何时你修改name属性,更改都会立即反映到 DOM 中。这太酷了!

绑定属性

Vue 可以将元素的属性绑定到数据属性上。绑定意味着保持属性与数据属性同步。您可以使用指令v-bind:ATTRIBUTE或简写来实现这一点:ATTRIBUTE。让我们来看一个例子:

<div id="app">
  <input v-bind:placeholder="placeholder" />
</div>
Enter fullscreen mode Exit fullscreen mode
new Vue({
  el: "#app",
  data: {
    placeholder: "James Bond",
  },
});
Enter fullscreen mode Exit fullscreen mode

条件渲染:v-if

v-if我敢打赌,光看名字你就能猜到它的用途了。它用于条件渲染:根据条件渲染元素。例如,你可能只想在用户是管理员时才渲染某些元素:

<div id="app">
  <p>Hello World</p>
  <p v-if="admin">You can see this sentence because you're an admin</p>
</div>
Enter fullscreen mode Exit fullscreen mode
new Vue({
  el: "#app",
  data: {
    admin: false,
  },
});
Enter fullscreen mode Exit fullscreen mode

以上例为例,您有:You can see this sentence because you’re an admin。如果您使用该应用程序,您只会看到这句话,因为传递给它的条件v-iftrueadmin)。

Vue 还提供了另一个条件指令:v-else`@on`。例如,您是否注意到某些网站在您登录后导航栏会发生变化?您可以想象一下,登录按钮和注册按钮会被个人资料或帐户按钮取代。这种行为正是 `@on` 和 `@ v-ifon`的完美用例v-else

带有 v-on 的事件

这是一个你会经常用到的指令。它允许你将事件监听器附加到元素上。v-on:event="method"这些事件触发时,会调用你的 Vue 实例的方法。你可以使用 `@EventListener`或简写形式 `@EventListener`来调用它们@event="method"

如果你有 React 背景,这类似于onClick`on` onChange、`on` 等事件。Vue 也有类似的事件:@click`on`、@keyup`on` @input、`on` 等。

现在你可能会想:“等等,他说的这些方法到底是什么?”。在 Vue 中,你可以methods像使用 `<script>` 标签一样,通过向 Vue 实例提供一个对象来为组件添加方法。使用方法相比普通的 JavaScript 函数的优势在于,方法可以访问 Vue 实例中声明的数据。由于你可以访问这些数据,因此你可以在方法中data修改组件的属性:data

<div id="app">
  <button @click="changeMessage">
    Click on me to change the sentence below
  </button>
  <p>{{ message }}</p>
</div>
Enter fullscreen mode Exit fullscreen mode
new Vue({
  el: "#app",
  data: {
    message: "Hello world!",
  },
  methods: {
    changeMessage() {
      this.message = "Hey everyone!";
    },
  },
});
Enter fullscreen mode Exit fullscreen mode

这里的新特性是使用了this`.`。这里,`.`this直接指向 Vue 实例。因此,你可以使用 `.` 从方法中轻松访问数据属性。这里,我们通过在`.` 方法中this.PROPERTY_NAME为 `.` 赋值来访问和更改消息this.messagechangeMessage

使用 v 模型的用户输入

在应用中,你经常需要获取用户输入。幸运的是!Vue 已经为你准备好了v-model。实际上,你可以使用双向绑定指令来实现这一点。双向绑定意味着:

  • 当模型的属性发生变化时,更改绑定的元素。
  • 当绑定元素发生变化时,改变模型的属性。
<div id="app">
  <input v-model="message" />
  <p>{{ message }}</p>
</div>
Enter fullscreen mode Exit fullscreen mode
new Vue({
  el: "#app",
  data: {
    message: "Hello World",
  },
});
Enter fullscreen mode Exit fullscreen mode

以下是使用该功能时幕后发生的情况v-model

  1. input通过以下方式绑定到属性v-model(从而实现双向绑定)
  2. 输入的初始值为message,即Hello World
  3. 你输入一些内容,比如说Hey everyone!
  4. 每当输入发生变化时,input都会向 Vue 实例发送一个事件。
  5. Vue 会改变message属性。
  6. 由于message这是一个响应式属性,视图会随之更新,并且这些更改已反映到您的元素中。换句话说,p标签中包含了新的值。message

你知道吗?`&&`v-model只是 `&& :value` 和 `&&`的语法糖@input。下面的代码与 `&&` 的功能相同v-model

<input :value="message" @input="message = $event.target.value" />
Enter fullscreen mode Exit fullscreen mode

实际上,每当你更改输入框时input,都会向 Vue 实例发送一个事件。这个事件包含一个target指向输入元素的对象。因此,你可以访问它的值并修改data属性。由于:value该对象绑定到这个数据属性,所以更改会立即生效。这并不难理解,对吧?🚀

使用 v-for 循环

在开发应用程序时,总会有需要渲染列表的时候:

  • 聊天信息
  • 搜索结果
  • 设置
  • 购物车商品
  • ETC。

Vue 再次提供了另一个处理列表的指令:v-for

您可以使用以下语法:v-for="item in list"。这里,list指的是您要遍历的数组,而是item一个数组元素的别名:

<div id="app">
  <p>Things I want to buy:</p>
  <ul>
    <li v-for="thing in things">{{ thing }}</li>
  </ul>
</div>
Enter fullscreen mode Exit fullscreen mode
new Vue({
  el: "#app",
  data: {
    things: ["Piano", "Car", "House"],
  },
});
Enter fullscreen mode Exit fullscreen mode

你还可以提供第二个参数v-for

  • 对于数组,第二个参数将是数组当前元素的索引。
  • 对于一个对象,第二个参数将是该对象当前元素的键。
<li v-for="(thing, index) in things">{{ thing }}</li>
Enter fullscreen mode Exit fullscreen mode

成分

到目前为止,你只了解了 Vue 指令和响应式编程。但正如之前提到的,Vue 也允许你创建组件:

Vue.component("my-component", {
  template: "<div>My component</div>",
});
Enter fullscreen mode Exit fullscreen mode

你可以使用 `createComponent` 方法创建一个新组件Vue.component。该方法的第一个参数是组件名称(my-component在本例中为 `<component_name>`)。与之相对,第二个参数是一个定义组件的对象。该对象的一个​​属性是 `<head>` template,它对应于组件的 HTML 代码。此外,还有 `<head>`datamethods`<body>`,实际上,几乎所有 Vue 实例的属性都包含在内,因为这些组件本身也是 Vue 实例!

道具

这就是组件的真正魅力所在。当你在应用程序中组合组件时,就会出现父组件和子组件。因此,组件之间的通信至关重要。一种方法是通过props父组件与子组件之间的通信。

以下是如何使用道具:

  • 在子元素上设置一个props属性。该属性的值props是一个数组,其中包含父元素传递给子元素的所有属性。
  • 在父级模板中,将组件元素所需的所有属性传递给它们。

注意:如果需要从 Vue 实例传递数据,也可以绑定 props。

<div id="app">
  <person name="Jack" age="19" country="Australia"></person>
  <person name="Emily" age="28" country="France"></person>
</div>
Enter fullscreen mode Exit fullscreen mode
Vue.component("person", {
  template: `
  <div>
    <p>{{ name }}</p>
    <p>Hello my name is {{ name }} and I'm {{ age }}! I live in {{ country }}.</p>
  </div>
  `,
  props: ["name", "age", "country"],
});

new Vue({
  el: "#app",
});
Enter fullscreen mode Exit fullscreen mode

通过向组件传递一个props属性,我们将数据从父组件传递到子组件。

笔记:

  • 构建数组时必须考虑周全props。如果漏掉任何一个属性,数组都无法正常工作。
  • 随着模板长度的增加,您需要使用模板字符串来定义多行模板。
  • 定义模板时,务必只保留一个根元素。否则,模板将无法正常工作。

自定义事件

我们知道如何从父组件向子组件传递信息。现在让我们看看反过来是怎么做的。我们可以通过使用自定义事件来实现。就像 props 一样,我们需要在父组件和子组件上分别定义一个值:

  • 在子组件中,您需要使用该$emit函数。此函数接受两个参数:事件名称和要发送给父组件的数据(可以是对象、字符串、数组等)。
  • 在父级模板中,使用v-on(或@)来监听子级将发出的事件。
<div id="app">
  <p>I'm the parent</p>
  <child @send="alertMessage"></child>
</div>
Enter fullscreen mode Exit fullscreen mode
Vue.component("child", {
  template: `
  <div>
    <p>I'm the child</p>
    <button @click="send">Send a message</button>
  </div>
  `,
  methods: {
    send() {
      this.$emit("send", "Hello!");
    },
  },
});

new Vue({
  el: "#app",
  methods: {
    alertMessage(message) {
      alert("My child sent me a message, it says: " + message);
    },
  },
});
Enter fullscreen mode Exit fullscreen mode

点击值为以下值的按钮后,会发生以下情况Send a message

  1. 由于子对象有click监听器,因此该send方法会被触发。
  2. 在 `<on> ` 中send,子进程send向父进程发出一个事件并传递字符串。Hello!
  3. 父节点接收到send来自子节点的事件,该alertMessage方法被触发。
  4. 在函数中alertMessage,我们调用该alert函数并显示孩子的留言,内容为:Hello!

通过构建待办事项应用程序进行回顾

信不信由你,你现在已经可以用上面学到的知识构建一个小型应用程序了。下面你会看到如何使用 Vue 构建一个待办事项应用程序:

<div id="app">
  <p>What should I do today?</p>
  <ul>
    <todo-item v-for="todo in todos" :todo="todo" @toggle="toggle"></todo-item>
  </ul>
  <input
    v-model="nextTodo"
    @keyup.enter="addTodo"
    placeholder="What's your next task?"
  />
</div>
Enter fullscreen mode Exit fullscreen mode
Vue.component("todo-item", {
  template: `
  <li class="todo-item">
    <input type="checkbox" @change="$emit('toggle', todo)" :checked="todo.done" />
    <span class="todo-item-text" :class="{'todo-item-checked': todo.done}">{{ todo.name }}</span>
  </li>
  `,
  props: ["todo"],
});

new Vue({
  el: "#app",
  data: {
    todos: [
      { name: "Learn Vue.js", done: true },
      { name: "Build an app", done: false },
    ],
    nextTodo: "",
  },
  methods: {
    addTodo(event) {
      this.todos.push({ name: this.nextTodo, done: false });
      this.nextTodo = "";
    },
    toggle(todo) {
      todo.done = !todo.done;
    },
  },
});
Enter fullscreen mode Exit fullscreen mode

瞧!你现在已经用 Vue 构建了一个基本的应用程序。这仅仅是个开始,但相信我,Vue 及其生态系统还有更多功能:计算属性和监听器生命周期钩子插槽使用 Vue CLI 生成项目使用 Vue Router 进行路由使用 Vuex 进行集中式存储

文章来源:https://dev.to/thomaslombart/getting-started-with-vue-bpl