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开发技巧总结 的相关文章

随机推荐

  • 浙大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 会导致与其相应路由的高