完整代码:
<template>
<div class=“hello”>
<img src='@/assets/logo django.png'style=“width:250px”/>
<p>下面的数据是使用Django的ORM和Restframork从Postgres数据库中添加/删除的。</p>
& BR/>
<P>主题</P>
<input type=“text”placeholder=“hello”v-model=“subject”>
<P>消息</P>
<input type=“text”placeholder=“from the other side”v-model=“msgBody”>
<br><br>
<input type=“submit”value=“add”@click=“postmessage”:disabled=“!主题>“MSGBORD”& GT;
& HR/GT;
<H3>数据库上的消息</H3>
<p v-if=“messages.length==0”>无消息</p>
<div class=“msg”v-for=“(msg,index)in messages”:key=“index”>
<p class=“msg index”>[index]</p>
<p class=“msg subject”v-html=“msg.subject”v-if=“!消息编辑“></p>
<p><input type=“text”v-model=“msg.subject”v-if=“msg.editing”></p>
<p>消息.编辑</p>
<p class=“msg body”v-html=“msg.body”v-show=“!消息[索引]。编辑“></p>”
<p><input type=“text”v-model=“msg.body”v-show=“messages[index].编辑“></p>
<input type=“submit”@click=“deleteMsg(msg.pk)”value=“删除”/>
<input type=“submit”@单击“editmsg(index)”value=“edit”/>
<input type=“submit”@click=“updateMsg(msg.pk)”value=“更新”/>
&L/DIV & GT;
&L/DIV & GT;
</template>
脚本& GT;
导出默认值{
名称:“消息”,
数据()
返回{
主题:“
MsgBoo:“
消息:
};
}
安装(){
this.fetchmessages();
}
方法:{
fetchmessages()。{
此。$backend.$fetchmessages()。然后(responsedata=>){
this.messages=响应数据;
this.messages.foreach(函数(值){
值['编辑']=false;
(});
console.log(this.messages);
(});
}
邮政消息()
const payload=主题:this.subject,主体:this.msgBody_
此。$backend.$postmessage(有效负载)。然后(()=>){
this.msgbody=“”;
this.subject=“”;
this.fetchmessages();
(});
}
删除消息(msgid){
此。$backend.$deleteMessage(msgid)。然后(()=>){
this.messages=this.messages.filter(m=>m.pk!)= MSGID);
this.fetchmessages();
(});
}
编辑消息(msgidx){
this.messages[msgidx].编辑=真;
console.log(this.messages);
}
更新消息(msgid){
console.log(this.subject,this.msgbody);
const payload=主题:this.subject,主体:this.msgBody_
此。$backend.$putmessage(msgid,有效负载)。然后(()=>){
this.fetchmessages();
}
)
}
}
};
& /脚本& GT;
&!--添加“scoped”属性以将CSS仅限于此组件-->
<样式范围
HR
最大宽度:65%;
}
MSG {
保证金:0自动;
最大宽度:30%;
文本对齐:左对齐;
边框底部:1px实心CCC;
填料:1雷姆;
}
MSG索引{
颜色:
字体大小:0.8rem;
/*下边距:0;。*/
}
IMG{
宽度:250px;
填充顶部:50px;
垫底:50px;
}
&风格/风格;
< /代码> <
}
每条消息如下:

注意到body
,pk
和subject
是Django模型字段。数组中的每个项表示一个数据库对象。
我想用vue.js做的是允许用户编辑每个项目。如果用户单击edit
按钮,我要将其元素从p
到input
,并将其提交到数据库。
以便编辑个人物品,我需要一个editing
数组中每个项的字段,所以我在mounted()
财产:
mounted() {
this.fetchMessages();
},
methods: {
fetchMessages() {
this.$backend.$fetchMessages().then(responseData => {
this.messages = responseData;
this.messages.forEach(function (value) {
value['editing'] = false;
});
console.log(this.messages);
});
},
现在,当我在控制台中加载数组时,我看到了:

所以我假设现在,当用户单击Edit
按钮,EditMsg
调用,字段将根据v-if
/v-show
指令:
EditMsg(msgIdx) {
this.messages[msgIdx].editing = true;
console.log(this.messages);
},
但这不会发生。实际发生的情况是:编辑
项的标志更改为true
在console/vue开发人员工具窗口中,HTML中没有任何更改。
我错过了什么?
完整代码:
<template>
<div class="hello">
<img src='@/assets/logo-django.png' style="width: 250px" />
<p>The data below is added/removed from the Postgres Database using Django's ORM and Restframork.</p>
<br/>
<p>Subject</p>
<input type="text" placeholder="Hello" v-model="subject">
<p>Message</p>
<input type="text" placeholder="From the other side" v-model="msgBody">
<br><br>
<input type="submit" value="Add" @click="postMessage" :disabled="!subject || !msgBody">
<hr/>
<h3>Messages on Database</h3>
<p v-if="messages.length ===0">No Messages</p>
<div class="msg" v-for="(msg, index) in messages" :key="index">
<p class="msg-index">[{{index}}]</p>
<p class="msg-subject" v-html="msg.subject" v-if="!msg.editing"></p>
<p><input type="text" v-model="msg.subject" v-if="msg.editing" ></p>
<p>{{msg.editing}}</p>
<p class="msg-body" v-html="msg.body" v-show="!messages[index].editing"></p>
<p><input type="text" v-model="msg.body" v-show="messages[index].editing" ></p>
<input type="submit" @click="deleteMsg(msg.pk)" value="Delete" />
<input type="submit" @click="EditMsg(index)" value="Edit" />
<input type="submit" @click="updateMsg(msg.pk)" value="Update" />
</div>
</div>
</template>
<script>
export default {
name: "Messages",
data() {
return {
subject: "",
msgBody: "",
messages: [],
};
},
mounted() {
this.fetchMessages();
},
methods: {
fetchMessages() {
this.$backend.$fetchMessages().then(responseData => {
this.messages = responseData;
this.messages.forEach(function (value) {
value['editing'] = false;
});
console.log(this.messages);
});
},
postMessage() {
const payload = { subject: this.subject, body: this.msgBody };
this.$backend.$postMessage(payload).then(() => {
this.msgBody = "";
this.subject = "";
this.fetchMessages();
});
},
deleteMsg(msgId) {
this.$backend.$deleteMessage(msgId).then(() => {
this.messages = this.messages.filter(m => m.pk !== msgId);
this.fetchMessages();
});
},
EditMsg(msgIdx) {
this.messages[msgIdx].editing = true;
console.log(this.messages);
},
updateMsg(msgId) {
console.log(this.subject, this.msgBody);
const payload = { subject: this.subject, body: this.msgBody };
this.$backend.$putMessage(msgId, payload).then(() => {
this.fetchMessages();
}
)
}
}
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
hr {
max-width: 65%;
}
.msg {
margin: 0 auto;
max-width: 30%;
text-align: left;
border-bottom: 1px solid #ccc;
padding: 1rem;
}
.msg-index {
color: #ccc;
font-size: 0.8rem;
/* margin-bottom: 0; */
}
img {
width: 250px;
padding-top: 50px;
padding-bottom: 50px;
}
</style>