vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs

这篇具有很好参考价值的文章主要介绍了vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ref

在 Vue 3 中,你可以使用 setup 函数来定义组件的数据和方法。在 setup 函数中,你可以使用 refreactivecomputed 等 Vue 3 的响应式 API 来定义数据,并返回一个包含你需要公开的数据和方法的对象。下面是一个例子:

import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const message = ref('Hello World');

    function showMessage() {
      alert(message.value);
    }

    return {
      message,
      showMessage
    };
  }
});

在这个例子中,我们使用 ref 函数来定义了一个名为 message 的响应式数据,并将其初始化为字符串 'Hello World'。我们还定义了一个名为 showMessage 的方法,它在被调用时会弹出一个包含 message 的提示框。最后,我们在 setup 函数的返回值中将 messageshowMessage 作为一个对象返回,这样它们就可以在组件的模板中使用了。

在组件的模板中,你可以使用插值语法和 v-on 指令来访问这些数据和方法。例如:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="showMessage">显示消息</button>
  </div>
</template>

在这个例子中,我们使用 {{ message }} 插值语法来显示 message 的值,并使用 @click 绑定了 showMessage 方法。当按钮被点击时,showMessage 方法就会被调用,弹出一个包含 message 的提示框。

需要注意的是,在 Vue 3 中,setup 函数是组件中定义数据和方法的主要方式。其他选项(如 datamethodscomputed)仍然可以使用,但它们只是 setup 函数的语法糖。如果你使用这些选项来定义数据和方法,Vue 3 会将它们转换为 setup 函数中的等效代码。

以下是一个简单的 Vue 3 应用程序示例,点击按钮时会将数据加 1:

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">加 1</button>
  </div>
</template>

<script>
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const count = ref(0);

    function increment() {
      count.value++;
    }

    return {
      count,
      increment
    };
  }
});
</script>

在这个例子中,我们使用 ref 函数来定义一个名为 count 的响应式数据,并将其初始化为 0。我们还定义了一个名为 increment 的方法,它在被调用时会将 count 的值加 1。最后,我们在 setup 函数的返回值中将 countincrement 作为一个对象返回,这样它们就可以在组件的模板中使用了。

在组件的模板中,我们使用 {{ count }} 插值语法来显示 count 的值,并使用 @click 绑定了 increment 方法。当按钮被点击时,increment 方法就会被调用,将 count 的值加 1,并且页面会自动更新显示最新的值。

可以将 increment 函数从普通函数改写为箭头函数,代码如下:

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">加 1</button>
  </div>
</template>

<script>
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const count = ref(0);

    const increment = () => {
      count.value++;
    };

    return {
      count,
      increment
    };
  }
});
</script>

在这个例子中,我们使用箭头函数语法定义了 increment 方法,这与使用普通函数的效果是一样的。箭头函数通常可以更简洁地表示函数逻辑,并且不需要绑定 this,因此在 Vue 3 中使用箭头函数作为组件的方法是很常见的。

 reactive 

reactive 是 Vue 3 中用于创建响应式对象的 API,它将一个普通的 JavaScript 对象转换为响应式对象,使得对象的属性能够在变化时触发视图的更新。

使用 reactive 创建响应式对象非常简单,只需要调用 reactive 函数并传入普通的 JavaScript 对象即可。例如:

import { reactive } from 'vue';

const state = reactive({
  count: 0,
  message: 'Hello, World!',
});

以下是一个简单的示例,演示如何使用 reactive 创建响应式对象,以及如何在视图中使用它们:

<template>
  <div>
    <p>Count: {{ state.count }}</p>
    <p>Message: {{ state.message }}</p>
    <button @click="increment">Increment</button>
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
import { reactive } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0,
      message: 'Hello, World!',
    });

    function increment() {
      state.count++;
    }

    function changeMessage() {
      state.message = 'Hello, Vue!';
    }

    return {
      state,
      increment,
      changeMessage,
    };
  },
};
</script>

在上面的代码中,我们使用 reactive 创建了一个响应式对象 state,包含两个属性 countmessage。我们还定义了两个方法 incrementchangeMessage,分别用于增加 count 属性的值和修改 message 属性的值。在模板中,我们使用插值语法 {{ }}v-on 指令绑定了 state 对象的属性和方法,以实现视图的响应式更新。@ 符号,它是 v-on 指令的缩写,用于绑定事件。

当我们点击 "Increment" 按钮时,increment 方法会将 count 属性的值增加 1,这会触发视图的响应式更新,使得 "Count" 文字后面的数字会自动更新为最新的值。

当我们点击 "Change Message" 按钮时,changeMessage 方法会将 message 属性的值修改为 "Hello, Vue!",这也会触发视图的响应式更新,使得 "Message" 文字后面的内容会自动更新为最新的值。

 文章来源地址https://www.toymoban.com/news/detail-418278.html

ref和reactive 的差别:

refreactive 都是 Vue 3 提供的用于实现响应式数据的 API,但它们的使用方式和作用略有不同。

  • ref:用于创建一个响应式的基本数据类型,如数字、字符串、布尔值等。ref 创建的响应式对象包装了一个基本类型的值,它提供了 .value 属性来访问包装的值,同时在模板中使用时,也需要通过 .value 来访问包装的值。
  • reactive:用于创建一个响应式的对象,可以包含多个属性。reactive 创建的响应式对象本身就是一个 JavaScript 对象,可以直接访问其中的属性,而不需要使用额外的 .value 属性。在模板中使用时,直接使用对象的属性名即可。

下面是一个示例,展示了 refreactive 同时存在时的使用方法和区别。

<template>
  <div>
    <!-- ref 示例 -->
    <p>count 的值是:{{ count }}</p>
    <button @click="increment">+1</button>

    <!-- reactive 示例 -->
    <p>person 的名字是:{{ person.name }}</p>
    <p>person 的年龄是:{{ person.age }}</p>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
  </div>
</template>

<script>
import { ref, reactive } from 'vue';

export default {
  setup() {
    // ref 示例
    const count = ref(0);
    const increment = () => {
      count.value++;
    };

    // reactive 示例
    const person = reactive({
      name: '张三',
      age: 20
    });
    const changeName = () => {
      person.name = '李四';
    };
    const changeAge = () => {
      person.age++;
    };

    return {
      count,
      increment,
      person,
      changeName,
      changeAge
    };
  }
}
</script>

<!-- 批注:
ref 用于创建单个数据的响应式值,需要使用 count.value 访问该值。
reactive 用于创建包含多个属性的响应式对象,可以通过 person.name 和 person.age 访问属性。 -->

 toRefs 

toRefs 是 Vue 3 中的一个 API,它可以将一个 reactive 对象中的所有属性都转换成 ref 对象,并返回一个包含这些 ref 对象的新对象。

在 Vue 3 中,由于 reactive 对象的属性是被代理的,所以无法直接通过解构的方式获取这些属性,并且也无法将它们传递给一些只接受 ref 对象的 API。而通过 toRefs,我们可以将这些属性都转换成 ref 对象,并且使用 ref 对象的方式来访问它们。

下面是一个使用 toRefs 的示例:

return{...toRefs(date)}这段代码的作用是将 reactive 对象 data 中的所有属性转换为 ref 对象,并将这些 ref 对象组成一个新的对象返回。

具体来说,toRefs 函数可以将 reactive 对象中的所有属性转换为 ref 对象,这样我们就可以像操作普通的 ref 对象一样操作 reactive 对象的属性。但是,由于 toRefs 返回的是一个对象,因此它并不能直接将这些 ref 对象合并为一个 reactive 对象。因此,我们需要使用 ES6 扩展运算符 ... 将这些 ref 对象组成一个新的对象并返回。

需要注意的是,使用 toRefs 转换出来的 ref 对象和原来的 reactive 对象中的属性绑定关系是保持一致的。也就是说,如果我们通过 ref 对象修改了某个属性的值,那么这个修改也会反映到 reactive 对象上。因此,toRefs 函数可以用来在模板中方便地使用 reactive 对象的属性,同时保持这些属性与 reactive 对象的绑定关系。

<template>
  <div>
    <p>count: {{ count.value }}</p>
    <p>message: {{ message.value }}</p>
    <button @click="increment">increment</button>
  </div>
</template>

<script>
import { reactive, toRefs } from 'vue'

export default {
  setup() {
    const data = reactive({
      count: 0,
      message: 'Hello, world!'
    })

    const increment = () => {
      data.count++
    }

    // 使用 toRefs 将 reactive 对象中的属性转换为 ref 对象
    // 然后将这些 ref 对象组成一个新的对象并返回
    return {
      ...toRefs(data),
      increment
    }
  }
}
</script>

在这个示例中,我们首先创建了一个 reactive 对象 data,其中包含了 countmessage 两个属性。然后,我们使用 toRefsdata 中的属性转换为 ref 对象,并将这些 ref 对象组成一个新的对象并返回。最后,我们在 setup 函数中定义了一个 increment 函数,用于增加 count 的值。在模板中,我们可以通过 count.valuemessage.value 来访问这些 ref 对象的值,并通过 @click="increment" 来监听按钮的点击事件。

 

到了这里,关于vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue全家桶进阶之路46:Vue3 Axios拦截器

    在Vue.js 3中,使用Axios与Vue.js 2.x中类似,但是需要进行一些修改和更新,下面是Vue.js 3中Axios的定义和使用方式: 首先,你需要安装Axios和Vue.js 3.x,可以使用npm或yarn等包管理工具安装: 然后,在你的Vue.js 3应用程序中,你可以使用以下代码来导入和使用Axios: 上面的代码使用

    2023年04月20日
    浏览(53)
  • vue全家桶进阶之路50:Vue3 环境变量+跨域设置实例

    使用.env加后缀的方式来建立某个模式下的环境变量, 例如:项目根目录新建两个环境变量文件(development开发环境和production生产环境):  在新建的两个环境变量文件中设置相同的环境变量名: 环境变量名称必须以\\\"VUE_API_\\\"+名称的格式,否则不生效,这个格式是死的。至于

    2023年04月21日
    浏览(45)
  • vue全家桶进阶之路32:Vue3 WatchEffect和watch 监听

    在 Vue 3 中, watchEffect 是一个用于监听响应式数据变化的 API。它可以在函数内部自动跟踪数据的依赖,并在依赖变化时重新运行函数。 watchEffect  的作用以及各个参数的功能讲解: watchEffect(effect: (onInvalidate: InvalidateCbRegistrator) = void | (() = void) | Promisevoid, options?: WatchEffectOptio

    2023年04月17日
    浏览(77)
  • vue全家桶进阶之路48:Vue3 跨域配置devServer的参数和设置

    devServer 是一个用于配置开发服务器的选项对象。它可以用来配置服务器的各种选项,例如代理,端口号,HTTPS 等。 以下是一些常用的 devServer 参数和设置: port :指定开发服务器的端口号,默认为 8080 。 host :指定开发服务器的主机名,默认为 localhost 。 https :开启 HTTPS,可

    2023年04月21日
    浏览(45)
  • vue全家桶进阶之路46:Vue3 Axios拦截器和globalProperties全局设置

    在Vue.js 3中,使用Axios与Vue.js 2.x中类似,但是需要进行一些修改和更新,下面是Vue.js 3中Axios的定义和使用方式: 首先,你需要安装Axios和Vue.js 3.x,可以使用npm或yarn等包管理工具安装: 然后,在你的Vue.js 3应用程序中,你可以使用以下代码来导入和使用Axios: 上面的代码使用

    2023年04月20日
    浏览(51)
  • vue全家桶进阶之路47:Vue3 Axios拦截器封装成request文件

    可以将Axios拦截器封装成一个单独的request文件,以便在整个应用程序中重复使用。 以下是一个示例,展示如何将Axios拦截器封装成一个request文件: 1、创建一个名为request.js的新文件,并导入Axios: 2、创建一个名为request的函数,并将其导出: 这将创建一个名为request的函数,

    2023年04月21日
    浏览(53)
  • vue全家桶进阶之路43:Vue3 Element Plus el-form表单组件

    在 Element Plus 中, el-form 是一个表单组件,用于创建表单以便用户填写和提交数据。它提供了许多内置的验证规则和验证方法,使表单验证更加容易。 使用 el-form 组件,您可以将表单控件组织在一起,并对表单进行验证,以确保提交的数据符合预期的格式和要求。该组件具有

    2023年04月20日
    浏览(44)
  • vue父子组件之间双向数据绑定的(vue2/vue3)

    vue父子组件之间双向数据绑定的四种方法(vue2/vue3) vue考虑到组件的可维护性,是不允许子组件改变父组件传的props值的。父组件通过绑定属性的方式向子组件传值,而在子组件中可以通过$emit向父组件通信(第一种方式),通过这种间接的方式改变父组件的data,从而实现子组

    2024年02月08日
    浏览(76)
  • Vue3全家桶 - Vue3 - 【7】生命周期

    Vue3官网-生命周期钩子函数; 每个Vue组件实例在创建时都需要经历一系列的初始化步骤,比如数据侦听、编译模板、挂载实例到 DOM ,以及在数据改变时更新 DOM 。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶段运行自己的代码。最常见的是

    2024年03月13日
    浏览(59)
  • 【Vue3】2-10 : 表单处理与双向数据绑定原理

    一、表单处理 1.1、【双向绑定】实现方式一:v-model >  代码  >  效果  1.2、【双向绑定】实现方式二::value属性 + input事件 >  代码  >  效果 (同上) 二、实战 2.1 【v-model 示例】输入框  >  代码 + 效果 (见1.1) 2.2 【v-model 示例】单选框  >  代码  >  效果 2

    2024年01月20日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包