【vue】Vue 全局API 详细介绍(nextTick、set、delete、......)

news2024/9/22 5:39:30

文章目录

        • 一、Vue.extend(options)
        • 二、 Vue.component
        • 三、Vue.nextTick([callback,context])/this.nextTick([callback,context])
        • 四、Vue.set(target,propertyName/index,value)/this.set(target,propertyName/index,value)
        • 五、Vue.delete(target,propertyName/index)
        • 六、Vue.filter()注册或获取全局过滤器=》定义本地的过滤器或在创建 Vue 实例之前全局定义过滤器:
        • 七、Vue.mixin()混入
        • 八、


一、Vue.extend(options)

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <title>Document</title>
  </head>
  <body>
    <div id="app"></div>
    <script>
      // 预设选项
      let baseOptions = {
        template: `<h1> {{ name }} - {{ age }}</h1>`,
        data() {
          return {
            name: 'houfee',
            age: '23岁'
          }
        }
      }
      // Vue.extend()来创建一个扩展实例构造器
      let baseExtend = Vue.extend(baseOptions)
      // 通过构造器函数,创建一个vue实例,然后挂载到一个元素上
      new baseExtend().$mount('#app')
      // let app = new baseExtend({el: '#app'})
    </script>
  </body>
</html>

当然,我们也可以把使用extend创建出来的实例挂载到自定义标签上(这里不再展开)。

Vue.extend只是创建一个构造器,这个构造器预设一些参数,这个构造器创建可复用的组件。其主要用来服务于Vue.component,用来生成组件。

二、 Vue.component

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <base-component></base-component>
    </div>
    <script>
      // 预设选项
      let baseOptions = {
        template: `<h1> {{ name }} - {{ age }}</h1>`,
        data() {
          return {
            name: 'houfee',
            age: '23岁'
          }
        }
      }
      Vue.component('base-component', baseOptions) // 其等于 Vue.component('base-component', Vue.extend(baseOptions))
      let app = new Vue({
        el: '#app'
      })
    </script>
  </body>
</html>

Vue.component()会注册一个全局的组件,其会自动判断第二个传进来的是Vue继承对象(vue.extend(baseOptions))还是普通对象(baseOptions),如果传进来的是普能对象的话会自动调用Vue.extend,所以你先继承再传,还是直接传普通对象对Vue.component()的最终结果是没差的。

Vue.extend()和Vue.component()的区别
Vue.component 创建的组件可以复用,和web组件一样,不需要polyfill。

要注册一个组件的步骤:
第一步,使用Vue.extend创建一个Vue的子类构造函数;
第二步,使用Vue.compontent方式注册该构造函数;
第三步,在标签中使用它。

三、Vue.nextTick([callback,context])/this.nextTick([callback,context])

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

在这里插入图片描述

四、Vue.set(target,propertyName/index,value)/this.set(target,propertyName/index,value)

在这里插入图片描述
在这里插入图片描述

五、Vue.delete(target,propertyName/index)

在这里插入图片描述
在这里插入图片描述

六、Vue.filter()注册或获取全局过滤器=》定义本地的过滤器或在创建 Vue 实例之前全局定义过滤器:

在这里插入图片描述
在这里插入图片描述

七、Vue.mixin()混入

官方说明:混入也可以进行全局注册。使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的 Vue 实例。使用恰当时,这可以用来为自定义选项注入处理逻辑。

在这里插入图片描述

八、

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>各种全局Api及属性的使用</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="app">
    <p>Vue.directive:用来注册自定义指令,对低级DOM元素进行访问,为DOM元素添加新的特性</p>
    <p>自定义注册指令v-focus:</p>
    <p>控制input文本框是否自动获得焦点</p>
    <p>打开文件时,光标自动插入该input</p>
    <p><input type="text" v-focus="true"></p>
    <hr size="2" color="#efefef"/>
    <div class="vue_use_content">
        <p>Vue.use:<br/>Vue.use主要用于在Vue中安装插件,通过插件可以为Vue添加<span>全局功能</span>。插件可以是一个<span>对象或函数</span><br/>
            如果是<span>对象</span>,必须提供<span>install()方法</span>,用来安装插件;如果是一个<span>函数</span>,则该函数将被当成<span>install()方法</span></p>
        <div class="my_directive_my_plugin" v-my-directive></div>
        <div class="vue_use_directive">
            <p>Vue.js官方提供的一些插件(如vue-router)在检测到 Vue 是可访问的全局变量时,</p>
            <p>会自动调用 Vue.use()</p>
            <p>但是在CommonJS等模块环境中,则始终需要Vue.use()显式调用</p>
        </div>
    </div>
    <div>
        <p>Vue.extend:</p>
        <p>Vue.extend用于基于Vue构造器创建一个Vue子类,可以对Vue构造器进行扩展。</p>
        <p>它有一个options参数,表示包含组件选项的对象</p>
        <div id="app1">app1: {{title}}</div>
        <div id="app2">app2: {{title}}</div>
    </div>
    <hr/>
    <div>
        <p>Vue.set:</p>
        <p>Vue的核心具有一套响应式系统,简单来说就是通过监听器监听数据层的数据变化,当数据改变后,通知视图也自动更新。</p>
        <p>Vue.set用于向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。</p>
        <p>
        <div>{{a}}</div>
        <div>{{obj.file_name}}</div>
        </p>
    </div>
    <hr color="#3efefe"/>
    <p>Vue.mixin:</p>
    <p>Vue.mixin用于全局注册一个混入,它将影响之后创建的每个Vue实例。</p>
    <p>该接口主要是提供给插件作者使用,在插件中向组件注入自定义的行为。</p>
    <p>该接口不推荐在应用代码中使用。</p>
    <hr/>
    <p>$props:使用vm.$props属性可以接收上级组件向下传递的数据。</p>
    <p>通过$props实现手机信息搜索(华为,vivo,三星,苹果)</p>
    <p>在子组件的data中定义props用来接收name的值</p>
    <!-- 父组件 -->
    <my-parent></my-parent>
    <hr size="2"/>
    <div class="option_content_vue">
        <p>$options:Vue实例初始化时,除了传入指定的选项外,还可以传入自定义选项。</p>
        <p>自定义选项的值可以是数组、对象、函数等,通过vm.$options来获取</p>
        <p>{{base}}</p>
        <p>{{noBase}}</p>
        <p>$el:vm.$el用来访问vm实例使用的根DOM元素,案例展示如下</p>
    </div>
    <div>
        <p>$children:vm.$el用来访问vm实例使用的根DOM元素,案例演示如下</p>
        <button @click="child">查看子组件</button>
        <my-component></my-component>
        <hr width="670" size="2"/>
        <p>$root</p>
        <p>vm.$root用来获取当前组件树的根Vue实例,如果当前实例没有父实例,则获取到的是该实例本身</p>
        <p>控制台查看结果:</p>
        <look-root-component></look-root-component>
    </div>
    <hr width="670" size="2"/>
    <!-- slots插槽 -->
    <p>$slots:Vue中的组件中使用template模板定义HTML结构,为了方便使用template公共模板结构。</p>
    <p>Vue提出了插槽(Slots)的概念,插槽就是定义在组件内部的template模板,可以通过$slots动态获取。</p>
 
</div>
<!-- 父组件模板 -->
<template id="parent">
    <div>
        <h3>手机信息搜索</h3>
        手机品牌:<input type="text" v-model="brand">
        <!-- 子组件 -->
        <my-child v-bind:name="brand"></my-child>
    </div>
</template>
 
<!-- 子组件模板 -->
<template id="child">
    <ul>
        <li>手机品牌:{{show.brand}}</li>
        <li>手机型号:{{show.type}}</li>
        <li>市场价格:{{show.price}}</li>
    </ul>
</template>
 
</body>
 
<script>
    Vue.directive('focus', {
        inserted(el, binding) {
            if (binding.value) {
                el.focus();
                console.info("v-focus传入的值: " + binding.value)
            }
        }
    });
    // 定义一个插件
    /* 定义一个MyPlugin(自定义插件)对象*/
    let MyPlugin = {};
    // 编写插件的install方法
    MyPlugin.install = function (Vue, options) {
        console.info("插件中输出options: " + options);
        // 在插件中未Vue添加自定义的指令
        Vue.directive('my-directive', {
            bind(el, binding) {
                // 为自定义指令v-my-directive绑定的DOM元素设置style样式
                el.style = 'margin:20px auto;height:100px;background-color:#ccc;padding-top:50px;color:#efefef'
                el.innerHTML = "可以在该插件内绘制表格";
            }
 
        });
    }
    // 使用插件
    Vue.use(MyPlugin, {someOption: true})
 
    let Vue2 = Vue.extend({
        data() {
            return {
                title: 'hello'
            }
        }
    });
    let vm1 = new Vue2({el: '#app1'})
    let vm2 = new Vue2({el: '#app2'})
    // Vue.set 设置新属性,并更新视图
 
    // 注册父组件
    Vue.component('my-parent', {
        template: "#parent",
        data() {
            return {
                brand: {}
            }
        }
 
    });
    // 组成子组件
    Vue.component('my-child', {
        template: "#child",
        data() {
            return {
                content: [
                    {brand: '华为', type: 'Mate20', price: 3699},
                    {brand: '苹果', type: 'iPhone7', price: 2949},
                    {brand: '三星', type: 'Galaxy S8+', price: 3299},
                    {brand: 'vivo', type: 'Z5x', price: 1698},
                    {brand: '一加', type: 'OnePlus7', price: 2999},
                    {brand: '360', type: 'N7 Pro', price: 1099},
                    {brand: 'oppo', type: 'Reno', price: 2599}
                ],
                show: {brand: '', type: '', price: ''}
            }
        },
        props: ['name'], // 用name属性来接收父组件传递过来的值
        watch: {
            name() {
                if (this.$props.name) {
                    let found = false
                    this.content.forEach((value, index) => {
                        if (value.brand === this.$props.name) {
                            found = value // 反映一条数据对象
                        }
                    })
                    this.show = found ? found : {brand: '', type: '', price: ''}
                } else {
                    return
                }
            }
        }
    });
 
    Vue.component('my-component', {
        template: '<div>myComponent</div>'}
    )
    // 查看根
    Vue.component('look-root-component',{
        template: '<button @click="root">查看根实例</button>',
        methods: {
            root () {
                console.log(this.$root)
                console.log(this.$root === vm.$root)
            }
 
        }
    })
 
 
    let vm = new Vue({
        el: "#app",
        myOption: 'helloWorld这是vue实例初始化时自定义的数据',
        customOption: '我是自定义数据',
        data: {
            a: '我是根级响应式属性a',
            obj: {},
            base: '我是基础数据'
        },
        created () {
            this.noBase = this.$options.customOption;
        },
        methods: {
            child () {
                console.log(this.$children)
            }
        }
 
    })
    Vue.set(vm.obj, 'file_name', '我是Vue.set添加的响应式属性obj的属性file_name');
    Vue.mixin({ // 注册混入
        created() {
            let myOptions = this.$options.myOption;
            if (myOptions) {
                console.info("初始化的属性: " + myOptions.toUpperCase());
            }
        }
 
    })
</script>
<style scoped>
    body {
        margin: 0px;
        padding: 0px;
        border: 0px;
        text-align: center;
        background-color: #657180;
    }
 
    div.vue_use_content span {
        font-size: 15px;
        font-family: '微软雅黑';
        color: #e3e6c7;
    }
 
    div.vue_use_directive {
        font-size: large;
    }
 
    div.option_content_vue {
        margin-top: 20px;
        margin-bottom: 17px;
        font-size: 17px;
        font-family: '微软雅黑';
    }
</style>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法:链表和数组哪个实现队列更快

背景 对于这个问题&#xff0c;我们先来思考一下数组和链表各有什么特点。 数组&#xff1a;连续存储&#xff0c;push 很快&#xff0c;shift 很慢。 链表&#xff1a;非连续存储&#xff0c;add、delete 都很快&#xff0c;但是查找很慢。 所以&#xff0c;我们可以得出结论…

QT 安装 及环境变量配置及出现的错误的解决方法

文章目录QT安装教程(win版)下载链接点击 产品 Qt开发工具点击 下载Qt下滑点击 开源用户下载下滑点击 下载Qt在线安装程序点击 win版本下载打开程序这一步可能遇到的问题1.在自己有Qt账号的情况下&#xff0c;下一步无法点击2.弹出一句话You need to verify your Qt account eai…

基础排序算法【快速排序+优化版本+非递归版本】

基础排序算法【快速排序优化版本非递归版本】&#x1f4af;&#x1f4af;&#x1f4af;⏰【快速排序】◽1.hoare法◽2.挖坑法◽3.前后指针法◽4.特性总结⏰【优化版本】◽1.随机选key◽2.三路取中◽3.小区间优化⏰【非递归版本】⏰【测试效率】排序OJ(可使用各种排序跑这个OJ)⏰…

CDH 6.3.2集群安装部署

文章目录CDH 6.3.2集群安装部署一 CDH概要1.1 CDH的背景1.2 CDH介绍二 环境准备2.1 安装部署环境2.2 部署规划2.3 服务器主机映射2.4 服务器免登录配置2.5 防火墙关闭2.6 关闭Selinux2.7 设置最大打开文件2.8 关闭最大透明页面压缩2.9 设置Swappiness空间2.10 安装JDK2.11 MySQ…

mysql中增删改成的练习

文章目录一、表的创建1.student表的数据2、课程表的数据course3、学生成绩表的数据二、操作序列1、查询计算机系cs的全体学生学号、姓名和性别2、检索选修了课程号为2的学生号和姓名3、检索至少选修了三门课以上的学生号4、检索选修了全部课程的学生5、在原表的基础上创建一个视…

java并发-线程池

java并发-线程池 线程池的介绍 Java线程池表示一组等待工作并多次重用的工作线程。在线程池的情况下&#xff0c;创建了一组固定大小的线程。服务提供者从线程池中拉出一个线程并分配一个作业。完成作业后&#xff0c;线程再次包含在线程池中。 使用线程池可以节省多线程应用…

Revit中如何绘制四面倾斜的屋顶?

一、Revit中如何绘制四面倾斜的屋顶&#xff1f; 如下图所示&#xff0c;像这种坡屋顶有两种方法进行绘制。具体操作如下。 第一种&#xff1a;定义坡度。 1、点击建筑选项卡中的屋顶按钮。 2、选择使用矩形工具。将偏移值修改为500。将屋顶迹线绘制出来。 3、选中全部屋顶迹…

信号浪涌保护器SPD选型方案

1.最大连续工作电压&#xff08;Uc&#xff09;&#xff1a;信号电路的最大电压必须小于Uc 最大连续工作电压Uc是最大工作信号电压&#xff0c;是电涌保护装置长期运行的信号电压或直流电压的最大有效值。这也是在额定漏电流条件下线与线之间或线与地之间的最大电压&#xff0…

UFT常用检查点的使用

录制时Flight自动打开。创建三个Action,分别命名为01_Login/02_New Order/03_Logout&#xff0c; 在Action里录制对应的Login/New Order/Logout操作。用飞机票预定系统订票&#xff0c;在02_New Order中设置起飞和到达城市参数化&#xff0c;用本地表数据&#xff08;至少2组数…

【排序算法(二)】选择排序(直接选择排序堆排序)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1、直接选择排序1.1 …

腾讯云轻量应用服务器搭建网站教程(WordPress为例)

腾讯云轻量应用服务器搭建WordPress网站教程&#xff0c;先安装WordPress应用镜像&#xff0c;然后远程连接轻量应用服务器获取WP用户名和密码&#xff0c;域名DNS解析到轻量服务器IP地址&#xff0c;登陆WordPress后台管理全过程&#xff0c;腾讯云百科来详细说下腾讯云轻量服…

作用域、闭包的理解、GC算法

1、全局作用域的变量是不会自动的的释放掉的 例如在 <script >let title "hello world"function coming(){alter(title) }</script> 只要不关闭网页或者浏览器&#xff0c;我们都可以在控制台调用 2、作用域环境我们可以理解为一块内存数据 3、函数作…

研报精选230416

目录 【行业230416国联证券】汽车行业4月周报&#xff1a;上海车展期待值高&#xff0c;政策加码一体化压铸【行业230416国联证券】农林牧渔行业周报&#xff1a;低猪价加深去化幅度&#xff0c;高标准农田建设推进【个股230416安信证券_万华化学】Q1业绩超预期&#xff0c;TDI…

靶机精讲之Prime

主机发现 192靶机 扫描靶机 进行对端口的服务和版本的扫描 保存信息 扫描UDP 一般都是http优先然后再shh vuln脚本扫描 web渗透 查看源码 目录爆破 dirb 翻刚才扫到的目录 dirb指定文件类型扫描 读取文件 保存 浏览链接 wfuzz模糊测试 专门扫PHP 只有两目录 浏览页面 模糊…

react2:children属性 - props进阶 - 生命周期

children属性&#xff1a;父想给子组件传递内容&#xff0c;都需要通过children占位 children属性&#xff1a;类似vue中的slot效果 props 类型验证 &#xff1a;现在都是 typescript 替代了 ref 放普通标签上可以获取dom节点 ref 放组件上获取组件实例&#xff0c;可以调用组件…

「C/C++」C/C++内存四大分区

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录术语一、文本区&#xff08;Text Segment&#xff09;/ 代码区二、数据区&#xff08;Data Segment&#xff09;/ 全局区三、栈区&#xff08;Stack Segment&#xff09;四、堆区&#xff08;Hea…

Redis应用问题解决

16. Redis应用问题解决 16.1 缓存穿透 16.1.1 问题描述 key对应的数据在数据源并不存在&#xff0c;每次针对此key的请求从缓存获取不到&#xff0c;请求都会压到数据源&#xff0c;从而可能压垮数据源。比如用一个不存在的用户id获取用户信息&#xff0c;不论缓存还是数据库…

美元霸权的潜在风险——无锚货币,为什么都要刺激消费

第三章 美元体系的风险结构与定价 金句导读 结果平等 没有智慧&#xff0c;优胜劣汰 没有良心。竞争都不充分。 年轻人有出路&#xff0c;穷人有活路&#xff0c;先富起来的人才能有后路。 名词解释&#xff1a; 对冲风险&#xff1a;我是卖面包的的&#xff0c;我还囤很多面…

【持续更新篇】SLAM视觉特征点汇总+ORB特征点+VINS前端

Harris角点 opencv函数 cornerHarris提取输入图像的Harris角点 检测原理 检测思想&#xff1a;使用一个固定窗口在图像上进行任意方向的滑动&#xff0c;对比滑动前后的窗口中的像素灰度变化程度&#xff0c;如果存在任意方向上的滑动&#xff0c;都有较大灰度变化&#xf…

Jetpack Compose 实战 宝可梦图鉴

文章目录前言实现效果一、架构介绍二、一些的功能点的介绍加载图片并获取主色,再讲主色设置为背景一个进度缓慢增加的圆形进度条单Activity使用navigation跳转Compose可组合项返回时页面重组的问题hiltViewModel()主要参考项目总结前言 阅读本文需要一定compose基础&#xff0…