我一直在玩 vue-next(vuejs 的第 3 版)并遇到了 HMR 的问题。这是我的环境和问题的概要,但是:
TL;博士; - 硬编码的道具不会在导入的组件上触发 HMR
关于环境的一些基本信息。我没有包含的任何文件都是 vue-next webpack 预览中的默认文件:https ://github.com/vuejs/vue-next-webpack-preview
包.json
{
"private": true,
"scripts": {
"serve": "webpack-dev-server",
"build": "webpack --env.prod"
},
"dependencies": {
"vue": "^3.0.0-beta.6"
},
"devDependencies": {
"@vue/compiler-sfc": "^3.0.0-beta.4",
"css-loader": "^3.5.3",
"file-loader": "^6.0.0",
"mini-css-extract-plugin": "^0.9.0",
"ts-loader": "^7.0.2",
"typescript": "^3.8.3",
"url-loader": "^4.1.0",
"vue-loader": "^16.0.0-alpha.3",
"webpack": "^4.43.0",
"webpack-bundle-analyzer": "^3.7.0",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3"
}
}
重现步骤
- 创建一个新的“组件”,我们称之为 Surface。它接受一个高程道具,该道具将用于计算名为 的 CSS 变量
--elevation
。
<script lang="ts">
import { computed, defineComponent } from "vue";
export default defineComponent({
name: "Surface",
props: {
elevation: {
type: Number as () => 0 | 1 | 2 | 3 | 4,
default: 0
}
},
setup(props) {
console.log(props.elevation);
const cssProps = computed(() => ({
"--elevation": `${props.elevation}em`
}));
return { cssProps };
}
});
</script>
<template>
<div :style="cssProps>Hello, world!{{ elevation }}</div>
</template>
<style scoped>
div {
border: 1px solid red;
display: inline-block;
padding: var(--elevation);
}
</style>
Surface
在另一个.vue
文件中使用组件:
<script lang="ts">
import { defineComponent } from "vue";
import { Surface } from "./Surface.vue";
export default defineComponent({
components: { Surface },
setup() {
return { };
}
});
<template>
<div :style="cssProps">Hello, world!{{ elevation }}</div>
</template>
<style scoped>
:root {
--elevation: 0rem;
}
div {
border: 1px solid red;
display: inline-block;
padding: var(--elevation);
}
</style>
</script>
<template>
<Surface :elevation="3" />
</template>
- 修改海拔道具。
预期Surface
的热模块更换触发并使用调整后的高度道具
重新渲染组件。
结果 Hot Module Replacement 不会在更改时触发,但组件会在重新加载时更新;正如所料。
这似乎只是硬编码道具的问题。当我使用它时const elevation = ref(0);
,它工作正常。
渲染的
截图