<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-th-list"></span> MVVM</h3>
</div>
<div class="panel-body">
<!-- vm -->
<div id="vm">
<h3>{{ title }}</h3>
<ol>
<li v-for="todo in todos">
<dl>
<dt contenteditable="true" v-on:blur="update(todo, 'name', $event)">{{ todo.name }}</dt>
<dd contenteditable="true" v-on:blur="update(todo, 'description', $event)">{{ todo.description }}</dd>
<dd><a href="#0" v-on:click="remove(t)">Delete</a></dd>
</dl>
</li>
</ol>
</div>
<!-- vm -->
</div>
</div>
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-plus"></span> Add New Todo</h3>
</div>
<div class="panel-body">
<!-- vmAdd -->
<form id="vmAdd" action="#0">
<div class="form-group">
<label>Name:</label>
<input type="text" v-model="name" class="form-control" placeholder="Enter name">
</div>
<div class="form-group">
<label>Description:</label>
<input type="text" v-model="description" class="form-control" placeholder="Enter description">
</div>
<button type="submit" class="btn btn-default" v-on:click.prevent="submit">Add</button>
</form>
<!-- vmAdd -->
</div>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
<script>
// 集成API
//https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00147576011615487c65971b3bd4acfa8ee94baaab3dbf7000
var bus = new Vue()
var vm = new Vue({
el: '#vm',
data: {
title: 'TODO List',
todos: [],
},
mounted: function() {
// bus.$on('todo', function(todo) {
// console.log(todo);
// this.todos.push(todo);
// }.bind(this))
},
created: function() {
this.init();
},
methods: {
init: function() {
this.todos = [{
name: "kavan",
description: "foo"
},
{
name: "lili",
description: "bar"
}
]
},
create: function(todo) {
this.todos.push(todo)
},
update: function(todo, prop, event) {
todo[prop] = event.target.innerText
}
}
});
var vmAdd = new Vue({
el: '#vmAdd',
data: {
name: '',
description: ''
},
methods: {
submit: function() {
vm.create(this.$data)
// bus.$emit('todo', this.$data)
this.name = '';
this.description = '';
}
}
});
</script>
</body>
</html>
这是老的问题题目(两个vue实例间传递数据问题, 怎么解除数据绑定?), 发现根本不是这原因于是更改了问题题目!
传对象时不能指向同一个对象的引用, 否则在另外一个组建中修改这个对象原组建的view也会因为vue实例中model的修改而发生变化, 目前我的解决方法是"克隆一个新对象"即在内存中新生成一个全新对象, 并把引用传给要通信的组件,JSON.parse(JSON.stringify(anObject)).即首先把对象转化成JSON字符串再把字符串转化成对象, 就相当于克隆了一个对象anObject. 这样这个问题就能得到解决!
事情的起因是想写了个mvvm模拟model更新DOM也同步更新的Demo, 碰到一个不可描述的问题冥想许久不得要领,于是来提问!
首先,发现不可以发动图,而这个问题作为新手表述不会全面,所以请复制代码放入html文件中打开网页, 然后在add表单中添加2个todo事件, 发现两个实例之间的数据是动态绑定, 这不是我想要的.
其实有更好的写法, 但是我认为这个问题的解决会加深对vue框架的理解,所以:
我尝试过把vmAdd中submit方法中的初始化name和description用setTimeout包裹没用, 用非父子组件间的数据传递(空实例, 代码注释了没有删除)也没用, 有哪位有耐心的大神打开代码帮看看要怎么解决, 虽然有其他方法比如只用一个vm实例可以解决, 或者不要在vmAdd中的表单上用v-model. 但是, 目前这种情况有没有解决的方法, 话说每个vue实例都是一个组件, vue api不应该一直跟踪数据的? 求解决, 谢谢
解决方法:
题外话: