VUE教程

Vue.js 响应式系统

响应式系统是Vue.js最具特色的功能之一。在Vue.js中,模型是普通的JavaScript对象。当我们必须修改模型时,视图将更新。这使状态管理变得简单而直观,但是了解它如何工作来避免一些常见的即将发生的问题也很重要。在这里,我们将看到如何使用反应性系统来解决这些问题。

它是如何工作的?

如果您通过普通的 JavaScript 对象 Vue.js 实例作为其数据选项,您将看到Vue.js通过其所有属性进行传递,并使用 Object.defineProperty 将它们转换为getter/setter。
这是一项不可填充的功能,并且仅支持ES5。由于此功能,Vue不支持IE8及更低版本。
吸气剂和设置器对用户不可见,但在幕后,它们使 Vue.js 能够在您必须更改或访问属性时执行依赖项跟踪和更改通知。您可以在浏览器的控制台上查看getter/setters属性的更改。如果要查看它们,则必须安装 vue-devtools 以提供更易于检查的界面。
每个组件实例都有一个相应的观察者实例。这用于将在组件渲染期间被"触摸"的属性记录为依赖项。此后,当依赖项的设置器被触发时,它将通知观察者,观察者依次重新渲染组件。
Vue.js反应性系统

Vue.js反应性界面

Vue.js提供了向动态添加的属性添加反应性的选项。假设我们已经创建了Vue.js实例,并且想要添加监听属性。请参见以下示例:
示例:
Index.html文件:
<html>
   <head>
      <title>Vue.js Reactive Interface</title>
      <link rel="stylesheet" href="index.css">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
      <div id = "reactivity_1">
         <p style = "font-size:25px;">Counter: {{ counter }}</p>
         <button @click = "counter++" style = "font-size:25px;">Click Here</button>
      </div>
      <script src="index.js"></script>
   </body>
</html>
Index.js文件:
var vm = new Vue({
            el: '#reactivity_1',
            data: {
               counter: 1
            }
         });
         vm.$watch('counter', function(nval, oval) {
            alert('Counter is incremented :' + oval + ' to ' + nval + '!');
         });
         setTimeout(
            function(){
               vm.counter = 10;
            },1000
         )
我们使用一个简单的CSS文件使输出更具吸引力。
Index.css文件:
html, body {
    margin: 5px;
    padding: 0;
}
程序执行后,您将看到以下输出:
输出:
Vue.js反应性系统
Vue.js Reactivity System
当您单击"单击此处"按钮时,计数器将增加。您将看到弹出输出或警报消息,其中显示计数器属性的更改值。
单击"单击此处"按钮后,请查看以下输出。
Vue.js反应性系统
Vue.js Reactivity System

示例说明

在上面的示例中,我们定义了一个属性计数器,该属性计数器在数据中设置为1目的。当您单击"单击此处"按钮时,计数器将增加。
创建 Vue.js实例,我们必须在其中添加监听属性。使用以下代码将其添加:
vm.$watch('counter', function(nval, oval) {
   alert('Counter is incremented :' + oval + ' to ' + nval + '!');
});
我们已使用$ 监听属性在Vue实例外部添加监视。我们还添加了一个警报,用于显示counter属性的值更改。还添加了一个名为setTimeout的计时器函数,以将计数器值设置为10。
setTimeout(
   function(){
      vm.counter = 10;
   },1000
);
每单击一次按钮,计数器都会更改,并且watch方法的警报也会被触发。

在运行时添加属性。

这是始终声明属性的最佳方法,因为在Vue.js实例中无法检测到属性的添加和删除,所以在Vue.js实例中需要对它们进行预先反应。时间,您必须使用 Vue全局,Vue.set Vue.delete 方法。

Vue.set

这用于在对象上设置属性。这是用来克服Vue.js无法检测到属性添加的限制。
语法
Vue.set( target, key, value )
在这里
target: 它可以是对象或数组。
key: 可以是字符串或数字。
value: 它可以是任何类型。
让我们举一个简单的例子来理解Vue.set的概念。
示例:
Index.html文件:
<html>
   <head>
      <title>Vue.js Reactive Interface</title>
      <link rel="stylesheet" href="index.css">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
      <div id = "reactivity_1">
         <p style = "font-size:25px;">Counter value: {{ products.id }}</p>
         <button @click = "products.id++" style = "font-size:25px;">Click Here</button>
      </div>
      <script src="index.js"></script>
   </body>
</html>
Index.js文件:
var myproduct = {"id":1, name:"shirt", "price":"1000.00"};
         var vm = new Vue({
            el: '#reactivity_1',
            data: {
               counter: 1,
               products: myproduct
            }
         });
         vm.products.qty = "1";
         console.log(vm);
         vm.$watch('counter', function(nval, oval) {
            alert('Counter is incremented :' + oval + ' to ' + nval + '!');
         })
程序执行后,您将看到以下输出:
输出:
Vue.js Reactivity System
在这里,您将看到每次单击" Click Here"按钮时计数器值都会增加。请参阅以下输出。在这里,我们单击了5次按钮。
Vue.js Reactivity System

示例说明

在上面的示例中,我们首先使用以下代码创建了一个名为 myproduct 的变量:
var myproduct = {"id":1, name:"shirt", "price":"1000.00"};
它被赋予Vue.js实例中的数据对象,如下所示:
var vm = new Vue({
            el: '#reactivity_1',
            data: {
               counter: 1,
               products: myproduct
            }
         });
假设,在创建Vue.js实例之后,您必须向 myproduct 数组中再添加一个属性。您可以通过使用以下代码来做到这一点:
vm.products.qty = "1";
如果您在控制台上看到输出,则将在产品列表中找到该数量,然后添加数量。 get/set方法(基本上增加了反应性)可用于id,名称和价格,而不适用于数量。
因此,您可以看到仅添加就不能实现反应性Vue对象。在Vue.js中,您必须首先创建其所有属性。如果您以后想要这样做,我们可以使用Vue.set。请参阅另一个示例,该示例稍后会添加所有属性。
示例:
Index.html文件:
<html>
   <head>
      <title>Vue.js Reactive Interface</title>
      <link rel="stylesheet" href="index.css">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
      <div id = "reactivity_1">
         <p style = "font-size:25px;">Counter value: {{ products.id }}</p>
         <button @click = "products.id++" style = "font-size:25px;">Click Here</button>
      </div>
      <script src="index.js"></script>
   </body>
</html>
Index.js文件:
var myproduct = {"id":1, name:"shirt", "price":"1000.00"};
         var vm = new Vue({
            el: '#reactivity_1',
            data: {
               counter: 1,
               products: myproduct
            }
         });
         Vue.set(myproduct, 'qty', 1);
         console.log(vm);
         vm.$watch('counter', function(nval, oval) {
            alert('Counter is incremented :' + oval + ' to ' + nval + '!');
         })
在上面的示例中,我们使用Vue.set通过以下代码向数组添加了数量:
Vue.set(myproduct, 'qty', 1);
如果在控制台上运行此示例,您将看到使用Vue.set方法添加了数量的获取/设置。

Vue.delete

Vue.delete函数用于动态删除属性。这也用于克服Vue.js无法检测到属性删除的限制。
语法:
Vue.delete( target, key )
在这里
target: 它用于指定对象或数组。
key: 用于指定字符串或数字。
让我们看一个示例,演示如何使用Vue.delete函数在Vue.js中动态删除任何属性。
示例
Index.html文件:
<html>
   <head>
      <title>Vue.js Reactive Interface</title>
      <link rel="stylesheet" href="index.css">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
      <div id = "reactivity_1">
         <p style = "font-size:25px;">Counter value: {{ products.id }}</p>
         <button @click = "products.id++" style = "font-size:25px;">Click Here</button>
      </div>
      <script src="index.js"></script>
   </body>
</html>
Index.js文件:
var myproduct = {"id":1, name:"shirt", "price":"1000.00"};
         var vm = new Vue({
            el: '#reactivity_1',
            data: {
               counter: 1,
               products: myproduct
            }
         });
          Vue.delete(myproduct, 'price');
         console.log(vm);
         vm.$watch('counter', function(nval, oval) {
            alert('Counter is incremented :' + oval + ' to ' + nval + '!');
         })
在上面的示例中,我们使用Vue.delete函数通过使用以下代码从数组中删除价格:
Vue.delete(myproduct, 'price');
当您在控制台上看到以上示例的输出时,您会看到删除价格后,在控制台上仅可见id和name。我们还将注意到get/set方法被删除了。

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4