代码之家  ›  专栏  ›  技术社区  ›  Stephen Tetreault

Vuex突变更新状态,计算属性从不反映标记中的更新

  •  0
  • Stephen Tetreault  · 技术社区  · 6 年前

    这个问题已经有一段时间没有被讨论过了,但是我在使用计算属性作为textArea值时,在我的末尾遇到了一些困惑。

    我有一个文本区域,您在其中提供输入文本,输入时它更新Vuex中的输入文本:

    <textarea
    ref="inputText"
    :value="getInputText"
    @input="setInputText"
    class="textarea"
    placeholder="Your message goes in here"
    ></textarea>
    

    点击一个按钮来翻译我称之为 handleInput 方法。

    handleInput() {
        this.$store.dispatch("translateEnglishToRussian");
    },
    

    在我的店里我有我的 translateEnglishToRussian 行动:

    translateEnglishToRussian({ commit }) {
        const TRANSLATE_API = "https://XXXXXXXX.us-east-1.amazonaws.com/prod/YYYY/";
        const data = JSON.stringify({ english: this.state.inputText });
    
        this.$axios
        .$post(TRANSLATE_API, data)
        .then(data => {
            commit("setOutputText", data.translatedText);
            commit("setMP3Track", data.mp3Path);
        })
        .catch(err => {
            console.log(err);
        });
    }
    

    我看到它的呼唤 setOutputText 突变与翻译文本的有效载荷,在我的vue dev工具中,我看到了翻译文本的正确状态。但是,我的第二个文本区域仅用于显示翻译后的文本 永不更新!

    输出文本区域:

    <textarea
    disabled
    ref="outputText"
    :value="getOutputText"
    class="textarea"
    ></textarea>
    

    它的值绑定到一个名为 getOutputText :

    getOutputText() {
        return this.$store.state.outputText;
    }
    

    我在这里做错什么了!感谢您的任何建议。我想这个应该没问题,因为我在用 commit 以同步方式(在then()块中)执行Vuex操作。

    编辑:如果我也尝试使用 v-model . Vuex状态的初始输出文本在页面加载时呈现在那里。当我翻译时,我在VueDev工具中正确地看到了更新,但是文本区域中的文本永远不会重新呈现。

    编辑2:这是我的 设置输出文本 突变:

      setOutputText(state, payload) {
        console.log(`state - set output - ${payload}`);
        state.outputText = payload;
      },
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   ljubadr    6 年前

    在看了Vue文档之后 Multiline text ,您应该替换 :value="getOutputText" 具有 v-model="getOutputText" .

    因为它是计算属性,在 v-model 你需要添加 get set 到您的计算属性

    <textarea
      disabled
      ref="outputText"
      v-model="getOutputText"
      class="textarea"
    ></textarea>
    

    编辑 :每 @斯蒂芬·特特特劳特 评论, V-模型 不是为他工作的,但是 :value 最终解决了这个问题。

    computed: {
      getOutputText: {
        // getter
        get: function () {
          return this.$store.state.outputText;
        },
        // setter
        set: function (newValue) {
          // there is no need to set anything here
        }
      }
    }