自从Vue3 Beta发布以来,我就尝试在小项目中使用它了,不得不说真是香,虽然对新手可能不太友好,但是对于用过React Hooks的人来说简直不要太爽,解决了React Hooks多次运行以及性能优化等多项心智负担,但是就在刚刚做好的一个动效在自己手机上完美运行,美滋滋的拿去给同事测试,然而同事的苹果手机却没有任何动态效果:
注意:最好用浏览器打开,还没开发完,可能会有bug!
组件间传值
在帧动画那个组件里请求的图片,但是图片请求了多少张这个数值需要传递到小心心那个组件去,发现$emit这种vue2传值法居然不好使了!
// 子组件
import { defineComponent } from 'vue'
export default defineComponent((props, ctx) => {
ctx.$emit('event', '来自子组件的值')
return {}
})
复制代码
<!--父组件-->
<Child @event="getChildValue"/>
复制代码
那个ctx就相当于vue2.x的this
然而这种在vue2.x中十分常见的传值方法在这里却没有任何效果。
Vue3传值方式
那么该如何传值呢?试试在React Hooks的那种自定义Hook再试试:
//抽取出来一个js文件
import { ref } from 'vue'
const count = ref(0)
export default number => {
count.value = number || count.value
return { count }
}
复制代码
<!--子组件A-->
<template>
<span>{{count}}</span>
</template>
<script>
import { defineComponent } from 'vue'
import useCount from '../use/useCount'
export default defineComponent(_ => {
const { count } = useCount()
return { count }
})
</script>
复制代码
<!--子组件B-->
<template>
<button @click="addCount">+</button>
<a href="#">{{count}}</a>
</template>
<script>
import { defineComponent } from 'vue'
import useCount from '../use/useCount'
export default defineComponent(_ => {
const { count } = useCount()
const addCount = _ => count.value++
return { count, addCount }
})
</script>
复制代码
<!--父组件-->
<template>
<A/>
<B/>
</template>
<script>
import A from './A'
import B from './B'
export default {
components: { A, B }
}
</script>
复制代码
watch + onMounted在IOS下的坑
本来是需要监听请求图片那个组件传回来的值来给小心心组件,每多请求回来一张图,小心心就放大一些,直到小心心充满屏幕。 于是乎我这样写了:
import { onMounted } from 'vue'
import { useXxx } from '../use/useXxx'
// 只贴出了关键代码
setup () {
const { val } = useXxx()
onMounted(_ => {
// 此处省略若干行业务代码
watch(val, v => console.log(v))
})
}
复制代码
这段代码在我的PC端和移动端都运行良好打印出值来,并且没有任何的报错,所以我才自信满满的去给别人看,结果一碰见苹果手机就……
解决方案
把watch函数提到生命周期函数外部使用。
import { onMounted } from 'vue'
import { useXxx } from '../use/useXxx'
// 只贴出了关键代码
setup () {
const { val } = useXxx()
watch(val, v => console.log(v))
onMounted(_ => {
// 此处省略若干行业务代码
})
}
复制代码
建议不要将watch函数与各种生命周期函数放在一起混用,否则可能会出现意想不到的bug。
来源:oschina
链接:https://my.oschina.net/u/4312205/blog/4260786