V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Zzzz77  ›  全部回复第 1 页 / 共 5 页
回复总数  96
1  2  3  4  5  
4 天前
回复了 yezheyu 创建的主题 程序员 请教一个 vue 中组件复用的问题
@BaiLinfeng 当然呀,一般情况组件只有被载入的时候会初始化一次,例如第一次加载,例如从 v-if="false"到 v-if="true"后。各个生命周期也就是在这时候开始执行的。
1 、从上个问题和这个问题的示例就能看出来,OP 完完全全不理解 MV*,正确的做法 #5 已经说的非常非常非常清楚了。
2 、首先明确一个点:OP 绑定 key 的目的是让子组件重新渲染,以此到达重新执行生命周期的目的。且不说你的例子中是否真的有重新执行生命周期的需求,即使真的有,也不该使用这种手段,举个例子:

正常的做法:
```
// 父组件
<template>
<ChildA :count="count" />

<button @click="count = count + 1">add</button>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import ChildA from './ChildA.vue'

const count = ref(1)
</script>
```

```
// 子组件
<template>
<div>{{count}}</div>
</template>

<script lang="ts" setup>
import { watch } from 'vue'

const props = defineProps({
count: {
type: Number,
required: true,
},
})

const func = () => {
console.log('render')
}

watch(() => props.count, func, { immediate: true })
</script>
```

OP 的做法:
```
// 父组件
<template>
<ChildA :count="count" :key="count" />

<button @click="count = count + 1">add</button>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import ChildA from './ChildA.vue'

const count = ref(1)
</script>
```

```
// 子组件
<template>
<div>{{count}}</div>
</template>

<script lang="ts" setup>
defineProps({
count: {
type: Number,
required: true,
},
})

const func = () => {
console.log('render')
}

func()
</script>
```

后者的问题:
①不易理解(特别是新手)。
②性能问题。
③最重要的一点,由于可控的粒度过大,很容易导致 BUG 。因此能 watch 解决的一般都不会选择这样去操作。

3 、继续强调刚才提到的一个点,OP 很多 [重新执行生命周期] 的需求根本就是伪需求,在之前的例子中完全没有必要,在本帖的例子中也没有必要(如#5 所讲的)。其实只是一个子组件接收父组件响应式数据的简单问题,就更没有必要绑定 key 强行让子组件重复渲染了。
6 天前
回复了 yezheyu 创建的主题 程序员 请教一个 vue 中组件复用的问题
@yezheyu #20 这种情况你不需要绑定这个 key 啊,父组件传递的 data 发生了改变,User 中接收的 data 这个 prop 自然会跟着变。楼上让绑定 key 只是为了让组件重新渲染从而达到重新执行生命周期这个目的,这是一种偏门骚操作,除非有什么极其特殊的需求(反正我没遇到过),不然绝对不推荐这么做,而你的需求只是最基本的父子组件传值而已,当然也不该这么做,如果有取值以外的副作用需要执行,正常 watch 就行。
9 天前
回复了 yezheyu 创建的主题 程序员 请教一个 vue 中组件复用的问题
这就是最基础的父子组件啊,首先 props 的定义是必须的,不理解 OP 为什么会选择用 attrs.name 这种方式来取父组件的值..

其次`User 组件内部的代码只会执行一次,`console.log` 不会随着 button 的点击事件执行多次`,这是当然的,和响应式无关,不管 name 变不变,console.log 肯定都只会执行一次。如果需要在 name 变化时执行一些副作用,watch 是最正统的方式,#8 的方法不建议...#16 的方法可行,但这明显更倾向 React 的思维
23 天前
回复了 wenwenjz 创建的主题 分享创造 [文文记账] 一周年了,发帖记录一下
好奇请问下 OP ,独立开发小程序的收益能够填补上微信每年认证费用和服务器 /Serverless 相关的费用吗?
34 天前
回复了 godfunc 创建的主题 开源软件 开源项目应该如何推广?
试试阮一峰周刊
36 天前
回复了 oyp 创建的主题 程序员 软著对大学生来说,有什么用吗?
学校期间可能有用,出了学校没用(除非你打算开公司)。
37 天前
回复了 bojue 创建的主题 职场话题 旅游一周回来,今天领了大礼包毕业了
不清楚 OP 开发这款产品是为了:1 单纯学习练手? 2 希望以此获利? 3 基于兴趣做开源?
1 的话其实做什么无所谓了,只要脱离开自己的舒适圈就好。
2 的话需要和市面上的产品拼竞争力,我也觉得白板或者低代码之类的东西市面上太多了,没啥竞争力。。
3 的话需要和同类开源作品拼竞争力,比 2 容易些,看你有无信心做得比其他开源项目更好了。
你的问题。
1 、确实觉得不值得换一家就行,虽然考虑到你有砍价的成分在,但在我看来说人家破盘子有些过了。(但整体来说这不是重点)
2 、看你的描述是你先带情绪发脾气。(这才是重点)
51 天前
回复了 wjx0912 创建的主题 Vue.js vue 项目单步调试还是 console.log?
console.log 真的够用了,之前看 antfu 直播,也有人问这个问题,他说他也是只用 console 的
52 天前
回复了 dominickkorey 创建的主题 程序员 V 站大佬那么多,导航人手有一个
我个人完全没有导航站的需求..之前也用过一些自定义导航的浏览器插件,相比浏览器默认空白页,打开时总会加载一下,极其不适....
另外在实用性方面:
对于常用的网站,相比较在一推导航中找到目标,我觉得直接输网址更效率,一般输入前两三个字母,后面就全出来了....
而对于不常用的网站,全部摆在首页,密密麻麻只会影响检索效率,还不如折叠起来,那这和浏览器自带的收藏不是一回事么....
大厂出来后能找到什么水平的工作?
如果在国内换中小公司能不能接受?
如果出国是定居还是打算以后回来养老?
以后打算回来还能回不?
能否承受出国失败的风险(时间、金钱)?
出国准备带家人吗?
家里老人想好怎么安顿了吗?
以后有小孩怎么安置?
你 /你的家人外语水平如何?
你们社交能力、性格如何?能否接受陌生环境(社交、当地文化)?
你到国外大概能搞个什么档次的工作,和国内对比有什么优劣势?

上面这些问题你自己想清楚七七八八了,你估计也知道该怎么选了,你要是自己都搞不清楚,到网上来问,相信我,在当前润学成灾的环境下(像楼上有人说的已经魔怔了),大家都会让你赶紧出国,跑晚了都是血亏。
我不是针对谁,我是说,所有能用所谓的低代码平台开发出来的网站 /系统 /应用,都是入门级 /初级产品(开发 /维护难度上)....

如果说害怕工作被这类东西取代,还不如考虑下怎么和这几年大量涌入市场的初级程序员竞争来得现实些....
54 天前
回复了 justanetizen 创建的主题 程序员 关于开源的一点想法
> “无数的人相信电视剧,将电视剧里描述的东西当成人生的一个追求,或者当成是自己想要过的一种理想生活”

没有吧,正常人都知道电视是演的,是假的,看电视刷视频就图一乐,谁会把电视里面的当追求啊。。。。。
1 、请安装编辑器 /IDE 插件;
2/4 、请使用 typescript;
3 、箭头函数和普通函数的作用并不完全一样,就像 var let const ,并不是相同功能的多个写法....可以去了解一下;
5 、这个只是 Vue ,并不能代表前端,但也没多大毛病,模板内的函数调用建议全部带上括号统一风格即可(语法糖而已),至于语法 /变量 /方法补全,同第一条~

另外 2L 不友善发言 OP 无需理会,但是用在 23L 却是极其的合理😆
59 天前
回复了 luin 创建的主题 程序员 临睡前收到了用户的一个差评
其实不建议在 V2EX 发开源相关的帖子,这里应该是对国内开源恶意最大的社区....😂
62 天前
回复了 jqsl2012 创建的主题 程序员 有没有好用的图片放大预览的 js 库?
68 天前
回复了 LeeReamond 创建的主题 程序员 前端 javascript 如何获取图片的宽高?
```typescript
const getImageSize = (src: string) => {
return new Promise(resolve => {
const img = document.createElement('img')
img.src = src
img.style.opacity = '0'
document.body.appendChild(img)

img.onload = () => {
const imgWidth = img.clientWidth
const imgHeight = img.clientHeight

img.onload = null
img.onerror = null

document.body.removeChild(img)

resolve({ width: imgWidth, height: imgHeight })
}

img.onerror = () => {
img.onload = null
img.onerror = null
}
})
}
```
1  2  3  4  5  
关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   888 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 67ms · UTC 20:46 · PVG 04:46 · LAX 13:46 · JFK 16:46
Developed with CodeLauncher
♥ Do have faith in what you're doing.