我正在尝试了解vue
组件的工作原理。最后一个目标是在点击我的Go时向readonly textarea
添加一行!按钮。目前我坚持使用以下代码:
// Register components
Vue.component('chatarea', {
delimiters: ['${', '}'],
props: ['msg'],
template: '<textarea readonly="" rows="20">${msg}</textarea>',
})
// Create a root instance
var app = new Vue({
el: '#app',
delimiters: ['${', '}'],
data: {
messages: [
'Hello from Vue!',
'Other line...'
],
},
methods: {
get_msg: function () {
return this.messages.reverse().join('\n');
}
}
})
以我想要的方式呈现以下html
- 消息以相反的顺序显示:
<div class="container" id="app">
<div class="row">
<div class="col-md-8 offset-md-2">
<form action="/question" enctype="multipart/form-data" method="get" v-on:submit.prevent="onSubmit">
<div class="input-group">
<input type="text" class="form-control" placeholder="Say Something...">
<span class="input-group-btn">
<button class="btn btn-secondary" type="button">Go!</button>
</span>
</div>
</form>
</div>
</div>
<div class="row" style="">
<div class="col-md-8 offset-md-2">
<chatarea :msg="get_msg()"></chatarea>
</div>
</div>
</div>
但是我收到以下警告:
[Vue警告]:您可能在组件渲染功能中有一个无限的更新循环。
我知道我做错了什么......这是JSFiddle
答案 0 :(得分:2)
您的模板调用get_msg
,重新计算反向消息数组,导致模板重新呈现并调用get_msg
等。
相反,请使用计算。
computed:{
reversedMessages(){
return this.messages.reverse().join('\n');
}
},
将模板更改为
<chatarea :msg="reversedMessages"></chatarea>