【问题标题】:在服务器端和客户端渲染之后如何操作 DOM?
【发布时间】:2022-01-23 16:49:53
【问题描述】:

这是我的代码(它是 Nuxt 应用程序中的 Vue 组件):

<template>
  <div class="comment-editor" v-if="loggedIn">
    <div class="leftside">
      <!-- <client-only> -->
      <textarea
        ref="editor"
        v-model="content"
        placeholder="your comment"
      ></textarea>
      <!-- </client-only> -->
      <Message v-bind="message" />
    </div>
    <Button
      text="Publish"
      color="main"
      v-if="message.type != 'loading'"
      @click="publish"
    />
  </div>
  <div class="notLoggedIn" v-else>
    You should <nuxt-link to="/signup">register</nuxt-link> or
    <nuxt-link to="/login">log in</nuxt-link> to write comments.
  </div>
</template>

<script>
export default {
  data() {
    return {
      content: "",
    };
  },
  mounted() {
    const tx = document.querySelector("textarea");
    fh(tx);
    tx.style.overflowY = "hidden";
    tx.addEventListener("input", function () {
      fh(this);
    });
    function fh(x) {
      while (x.style.height + "" != x.scrollHeight + "px")
        x.style.height = x.scrollHeight + "px";
    }
  },
};
</script>

您在“mounted”函数中可以看到用于动态更改文本区域的高度。当组件在客户端渲染时(即从另一个页面导航时),它可以正常工作,但应用程序在 SSR 之后崩溃(当直接使用组件打开页面时)。如何使该代码在这两种情况下都能正常工作?

【问题讨论】:

  • 首先,你可能不应该在这里使用 JS 来固定高度,而应该依赖 CSS。那么,如果您不使用它,为什么要声明 editor 参考?更喜欢使用 $refs 而不是查询选择器。此外,使用while 可能是个坏主意,因为它会阻塞,而且前端没有什么真正需要它。 mounted() 只在客户端执行,所以我不确定它为什么会在这里崩溃。一开始看起来还可以。你有minimal reproducible example 吗?在这里会有很大帮助!

标签: javascript node.js vue.js nuxt.js


【解决方案1】:

您应该使用动态样式而不是直接的 DOM 操作。

例如,&lt;textare :style="{ height: computedHeight }" /&gt;

https://vuejs.org/v2/guide/class-and-style.html#Object-Syntax-1

【讨论】:

    【解决方案2】:

    问题在于,当组件被安装时,最初,class="leftside" 元素不是 dom 的一部分(由于loggedIn 等于false)。解决方案是将 class="leftside" 元素和mounted() 函数移到单独的组件中。

    【讨论】:

    • 问题实际上不止于此。正如我在评论中所解释的,这里有一些问题需要解决。您应该尝试坚持使用 Vue API。如此处所述:stackoverflow.com/q/70456948/8816585
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2023-04-09
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多