Vue开发技巧总结

2023-11-06

1.路由参数解耦

通常在组件中使用路由参数,大多数人会做以下事情。

export default {
    methods: {
        getParamsId() {
            return this.$route.params.id
        }
    }
}


 在组件中使用 $route 会导致与其相应路由的高度耦合,通过将其限制为某些 URL 来限制组件的灵活性。正确的做法是通过 props 来解耦。

const router = new VueRouter({
    routes: [{
        path:  /user/:id ,
        component: User,
        props: true
    }]
})

将路由的 props 属性设置为 true 后,组件内部可以通过 props 接收 params 参数。

export default {
    props: [ id ],
    methods: {
        getParamsId() {
            return this.id
        }
    }
}

还可以通过功能模式返回道具。

const router = new VueRouter({
    routes: [{
        path:  /user/:id ,
        component: User,
        props: (route) => ({
            id: route.query.id
        })
    }]
})


2.功能组件

功能组件是无状态的,它不能被实例化,也没有任何生命周期或方法。创建功能组件也很简单,只需在模板中添加功能声明即可。它一般适用于只依赖于外部数据变化的组件,并且由于其轻量级而提高了渲染性能。组件需要的一切都通过上下文参数传递。它是一个上下文对象,具体属性见文档。这里的 props 是一个包含所有绑定属性的对象。

<template functional>
    <div class="list">
        <div class="item" v-for="item in props.list" :key="item.id" @click="props.itemClick(item)">
            <p>{{item.title}}</p>
            <p>{{item.content}}</p>
        </div>
    </div>
</template>

父组件使用

<template>
    <div>
        <List :list="list" :itemClick="item => (currentItem = item)" />
    </div>
</template>
 
import List from  @/components/List.vue
export default {
    components: {
        List
    },
    data() {
        return {
            list: [{
                title:  title ,
                content:  content
            }],
            currentItem:
        }
    }
}

3.样式范围

开发中修改第三方组件样式很常见,但是由于scoped属性的样式隔离,可能需要去掉scoped或者另起一个样式。这些做法有副作用(组件样式污染,缺乏优雅),在css预处理器中使用样式渗透来生效。可以使用 >>> 或者 /deep/ 来解决这个问题:

<style scoped>
Outer layer >>> .el-checkbox {
  display: block;
  font-size: 26px;
 
  .el-checkbox__label {
    font-size: 16px;
  }
}
</style>
<style scoped>
/deep/ .el-checkbox {
  display: block;
  font-size: 26px;
 
  .el-checkbox__label {
    font-size: 16px;
  }
}
</style>


4.watch的高级使用

watch 在监听器属性发生变化时触发,有时希望 watch 在组件创建后立即执行。可能想到的方式是在创建生命周期中调用它一次,但这不是一种优雅的编写方式,所以也许可以使用这样的东西。

export default {
    data() {
        return {
            name:  Joe
        }
    },
    watch: {
        name: {
            handler:  sayName ,
            immediate: true
        }
    },
    methods: {
        sayName() {
            console.log(this.name)
        }
    }
}

Deep Listening

监听一个对象时,当对象内部的属性发生变化时,watch是不会被触发的,所以可以为它设置深度监听。

export default {
    data: {
        studen: {
            name:  Joe ,
            skill: {
                run: {
                    speed:  fast
                }
            }
        }
    },
    watch: {
        studen: {
            handler:  sayName ,
            deep: true
        }
    },
    methods: {
        sayName() {
            console.log(this.studen)
        }
    }
}

触发监听器执行多个方法

使用数组,可以设置多个形式,包括字符串、函数、对象。

export default {
    data: {
        name:  Joe
    },
    watch: {
        name: [
             sayName1 ,
            function(newVal, oldVal) {
                this.sayName2()
            },
            {
                handler:  sayName3 ,
                immaediate: true
            }
        ]
    },
    methods: {
        sayName1() {
            console.log( sayName1==> , this.name)
        },
        sayName2() {
            console.log( sayName2==> , this.name)
        },
        sayName3() {
            console.log( sayName3==> , this.name)
        }
    }
}

5.watch监听多个变量

watch 本身不能监听多个变量。但是,可以通过返回具有计算属性的对象然后监听该对象来“监听多个变量”。

export default {
    data() {
        return {
            msg1:  apple ,
            msg2:  banana
        }
    },
    compouted: {
        msgObj() {
            const { msg1, msg2 } = this
            return {
                msg1,
                msg2
            }
        }
    },
    watch: {
        msgObj: {
            handler(newVal, oldVal) {
                if (newVal.msg1 != oldVal.msg1) {
                    console.log( msg1 is change )
                }
                if (newVal.msg2 != oldVal.msg2) {
                    console.log( msg2 is change )
                }
            },
            deep: true
        }
    }
}


 

6.事件参数$event

$event 是事件对象的一个特殊变量,它在某些场景下为提供了更多的可用参数来实现复杂的功能。本机事件:与本机事件中的默认事件对象行为相同。

<template>
    <div>
        <input type="text" @input="inputHandler( hello , $event)" />
    </div>
</template>
 
export default {
    methods: {
        inputHandler(msg, e) {
            console.log(e.target.value)
        }
    }
}

自定义事件:在自定义事件中表示为捕获从子组件抛出的值。

export default {
    methods: {
        customEvent() {
            this.$emit( custom-event ,  some value )
        }
    }
}
<template>
    <div>
        <my-item v-for="(item, index) in list" @custom-event="customEvent(index, $event)">
            </my-list>
    </div>
</template>
 
export default {
    methods: {
        customEvent(index, e) {
            console.log(e) //  some value
        }
    }
}


 7.程序化事件监听器

例如,在页面挂载时定义一个定时器,需要在页面销毁时清除定时器。这似乎不是问题。但仔细观察,this.timer 的唯一目的是能够在 beforeDestroy 中获取计时器编号,否则是无用的。

export default {
    mounted() {
        this.timer = setInterval(() => {
            console.log(Date.now())
        }, 1000)
    },
    beforeDestroy() {
        clearInterval(this.timer)
    }
}

如果可能,最好只访问生命周期挂钩。这不是一个严重的问题,但可以认为是混乱。可以通过使用 或once 监听页面生命周期销毁来解决这个问题:

export default {
    mounted() {
        this.creatInterval( hello )
        this.creatInterval( world )
    },
    creatInterval(msg) {
        let timer = setInterval(() => {
            console.log(msg)
        }, 1000)
        this.$once( hook:beforeDestroy , function() {
            clearInterval(timer)
        })
    }
}

使用这种方法,即使同时创建多个定时器,也不影响效果。这是因为它们将在页面被销毁后以编程方式自动清除。

8.监听组件生命周期通常使用 $emit 监听组件生命周期,父组件接收事件进行通知

子组件

export default {
    mounted() {
        this.$emit( listenMounted )
    }
}
 

父组件

<template>
    <div>
        <List @listenMounted="listenMounted" />
    </div>
</template>

其实有一种简单的方法就是使用@hook 来监听组件的生命周期,而不需要在组件内部做任何改动。同样,创建、更新等也可以使用这个方法。

<template>
    <List @hook:mounted="listenMounted" />
</template>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue开发技巧总结 的相关文章

  • 了解设置 JQuery 变量

    了解设置 JQuery 变量 最近 我通过在 StackOverflow 上遇到的另一个问题寻找帮助 了解到如何设置 JQuery 变量 如下所示 您可以通过简单地调用变量来创建输入字段 并且锚变量似乎也定义了样式 var clicked
  • 尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true

    在我的 aspx 页面中 我将布尔变量 C 传递给需要布尔类型的 javascript 函数 但遇到了问题 但是 C 变量返回 True 而 javascript 不喜欢大写 myjavascript 如果我将 c 变量转换为字符串 那么我
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 使用 Angular 下载具有动态 src 的脚本

    Angular 提供了通过动态名称动态加载模板的方法ng include 该部分中的内联 JS 和 CSS 可以正常加载 但没有一个好的方法来下载带有动态 url 的脚本 我们需要下载脚本 相对于调用它们的 html 部分的路径 即我们有一
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • Vue:通过 CSS 选择组件的最简洁方法是什么?

    我有一个bar成分 它的使用方式如下
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比

随机推荐

  • 浙大PTA 编程题 03-树2 List Leaves (25 分)(c++)

    思路 这道题的意思就是 按照层序来输出叶结点 因为是按照层序 所以遍历树中元素的方式就不同于树的同构了 因为遍历完左儿子1 不能遍历左儿子1的左儿子2 而是要遍历和左儿子1并列的右儿子1 这就需要我们记住左儿子1的父亲 才能找到右儿子1 这
  • C#接口详解

    接口 什么是接口 接口的作用是什么 接口的特点 接口的语法特点 接口的使用 什么情况下应该使用接口 总结 什么是接口 使用关键字interface创建的数据类型 接口的作用是什么 1 扩展一个已有类的行为 2 规范不同类型的行为 接口的特点
  • 个人实战项目之“畅聊“测试用例设计

  • Jquery入门一

    jQuery 语法是通过选取 HTML 元素 并对选取的元素执行某些操作 基础语法 selector action 美元符号定义 jQuery 选择符 selector 查询 和 查找 HTML 元素 选择器 jQuery 的 action
  • 微信小程序--优购商城项目(5)

    文章目录 前言 六 商品列表 1 创建 goodslist 分支 2 定义请求参数对象 3 获取商品列表数据 4 渲染商品列表结构 5 把商品 item 项封装为自定义组件 6 使用过滤器处理价格 7 上拉加载更多 1 初步实现上拉加载更多
  • 一键删除AD生成的历史文件

    起因 最近发现磁盘不太够了 看了下AD生成的临时文件和历史文件占用了较大的空间 一个一个的删除太麻烦了 所以写了个脚本 使用方法 在要删除的根目录新建一个文件 并将其命名为KillAD bat 这里记得修改后缀名字为bat 然后用文本形式打
  • windows下redis安装与卸载以及过程中遇到的问题解决方案

    前言 这里redis的安装与卸载非常简单 并不是像安装jdk一样需要手动运行某 exe文件 redis安装只需要把redis服务配置到windows服务列表就算完成了 一 安装redis 打开cmd窗口进入redis存放的盘符 例如 运行启
  • 确保Web地址 //ieframe.dll/dnserrordiagoff.htm#正确

    今天来解决一个新的问题 即在用 chm文件与visual studio做联机帮助时遇到的 确保Web地址 ieframe dll dnserrordiagoff htm 正确 如下图所示 em 这个错误确实让我无语住了 有点荒谬也很炸裂 原
  • 构建基础篇 2:webpack 在 CLI 3 中的应用

    鄙人已付费购买 粘贴出来给更多前端爱好者学习 若掘金小册禁止此类操作 请联系 webpack 作为目前最流行的项目打包工具 被广泛使用于项目的构建和开发过程中 其实说它是打包工具有点大材小用了 我个人认为它是一个集前端自动化 模块化 组件化
  • openwrt在命令行或脚本中实现毫秒级延时

    在Linux openwrt等嵌入式系统中在命令行或者脚本中只能实现秒级延时 比如sleep命令 可以通过头文件位于unistd h的usleep函数实现毫秒级延时 再将其封装为 命令即可 比如 xdelayms 100 100ms del
  • logback 自定义log字段(MDC)推送到logstash(spring boot + logback+ logstash)

    直接上代码 1 创建FIlter 往 MDC 里面追加内容 WebFilter Component public class LogBackFilter implements Filter Override public void init
  • Sharding-JDBC数据源初始化卡死在{dataSource-X} inited

    遇到一个问题 排查了比较久 如果有遇到类似的问题 可以参考一下 问题描述 Sharding JDBC在只有一个主从数据源的情况下会扫描数据库全表 如果该库建表较多 如 单库分1024张表 会造成数据源初始化接近半小时之久 解决方案 增加一个
  • VOC分析的实际流程

    VOC分析的实际流程 实际进行VOC分析的时候 应该做什么 怎么做呢 其大致流程如下图所示 接下来 将分别进行具体说明 明确目的 首先应该做的是明确 为了什么进行VOC分析 的目的 正如前文所述 VOC种类繁多 数量庞大 其分类和分析方法也
  • Python from import导包ModuleNotFoundError No module named,找不到模块问题

    在学习Flask框架的蓝图时 遇到导包时用到了 from 模块 import 对象 然后试了试直接 import会报错 直接告诉我找不到模块 发现问题以此记录 场景 有一个flask框架的项目 目录结构如下 有一个主包pro flask 然
  • Linux中find指令基本详解

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net caicai1617 article details 21512239 find指令的
  • 思普协同服务器不稳定,思普操作系统怎么样?

    思普操作系统怎么样呢 思普操作系统功能有哪些呢 思普操作系统有桌面版和服务器版两种 简单实用 具体思普操作系统怎么样 思普操作系统好用吗 我们一起来了解一下 思普操作系统怎么样 1 思普操作系统将办公 娱乐 通讯等开源软件一同封装到办公系统
  • git生成Key操作保存到GITHUB中

    https blog csdn net sinat 23880167 article details 78502528 1 在git中通过命令 ssh keygen Generating public private rsa key pai
  • Kali Linux 学习资源整理

    Kali Linux 官网 https www kali org Kali Linux官方教材 https kali training Penetration Testing Training with Kali Linux https w
  • cookies,session,token的区别和使用(接口参考)

    cookies session token的区别和使用 接口参考 1 依据和使用 基于cookie 因cookie的验证是有状态的 验证流程 用户输入登陆凭据 服务器验证凭据是否正确 并创建会话 然后把会话数据存储在数据库中 具有会话id的
  • Vue开发技巧总结

    1 路由参数解耦 通常在组件中使用路由参数 大多数人会做以下事情 export default methods getParamsId return this route params id 在组件中使用 route 会导致与其相应路由的高