рдЕрджреНрдпрддрди:
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд╕рд▓рд╛рд╣ рдФрд░ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде vue-nonreactive рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЧреИрд░-рд╕рд╛рджреЗ рдореЙрдбрд▓ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ Vue рдХреЗ рдЕрд╡рд▓реЛрдХрди рдФрд░ рдЪрд▓рдиреЗ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рдВрд╕рд╛рдзрди рдореЙрдбрд▓ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдХреИрд╢ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХреЗред рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдХреИрд╢ рдореЗрдВ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдЕрдХреНрд╖рдо), рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдиреНрдп рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЯрд░реИрдХреНрд╢рдиред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╣рдо рдХреИрд╢ рдкрд░ рдПрдХ рдбрдореА рдСрдмреНрдЬрд░реНрд╡рд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕реА рддрд░рд╣...
import get from 'http';
import Resource from 'resource';
new Vue({
data: { instance: {}, },
ready() { this.fetch(); },
methods: {
fetch() {
const Observer = Object.getPrototypeOf(this.instance.__ob__).constructor;
get('/api/frobs')
.then(function(data) {
// initialize Resource w/ JSON document
const resource = new Resource(data);
// Protect cache with dummy observer
resource.cache.__ob__ = new Observer({});
this.instance = resource;
});
},
},
});
рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
Observer
рд╡рд░реНрдЧ рдХреЛ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдкреНрд░рд╕реНрддрд╛рд╡:
Vue рдХреЗ рдЕрд╡рд▓реЛрдХрди/рдЪрд▓рдиреЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдЬреИрд╕реЗ, рдХреБрдЫ рдРрд╕рд╛...
const someThing = {
nestedThing: {},
};
// make entire object non-reactive
Vue.nonreactive(someThing);
// make nested object non-reactive
Vue.nonreactive(someThing.nestedThing);
vm.$set('key.path', someThing);
рд╡рд┐рдЪрд╛рд░:
``` рдЬреЗрдПрд╕
vm.$set('a', Vue.nonreactive({});
// рд╕реЗ рдЕрд▓рдЧ..
рд╡реАрдПрдоред $ рд╕реЗрдЯ ('рдП', {
someKey: Vue.nonreactive({}),
});
```
``` рдЬреЗрдПрд╕
// рддреНрд░реБрдЯрд┐
Vue.nonreactive(vm.$data.a)
// рдорд╛рдиреНрдп
Vue.nonreactive(_.clone(vm.$data.a));
```
рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ Object.freeze()
рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛? рдпрд╣ v1.0.18 . рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИ
data
, рдХрд╛ рдЙрдкрдпреЛрдЧ Object.freeze()
рдЙрд╕ рдкрд░;data
рдкрд░ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП this
ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ this
рдХреЗ рд╕рд╛рде created()
рд╣реБрдХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИредObject.freeze
рдпрд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреИрд╢ рд╕рдордп рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреЗ рдореЙрдбрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдиреАрдЪреЗ рдХреНрдпреЛрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдХреНрдпреЛрдВрдХрд┐ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Author
рдФрд░ Post
рдореЙрдбрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦрдХ рдореЙрдбрд▓ рдкреЛрд╕реНрдЯ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП posts
рдирд╛рдордХ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреИрд╢ рдореЗрдВ рд╕рдВрдмрдВрдз рдбреЗрдЯрд╛, рд╕рд╛рде рд╣реА рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред
рд▓реЗрдЦрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред рдкреЛрд╕реНрдЯ рдХреИрд╢ рд╕реЗ рдкреЛрд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, Vue рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░рд╛рдЬреНрдп-рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ Vue рдЙрджрд╛рд╣рд░рдг рдХреЗ data
рдбрд╛рд▓рдиреЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╢реБрджреНрдз рд╕реНрдерд┐рддрд┐ рдХреЛ Vue рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рджреЗрдЦреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рд╡реИрд╕реЗ рднреА рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ Vue рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд╣рд▓рд╛, рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд╢реНрди - рд╢реБрджреНрдз рдЕрд╡рд╕реНрдерд╛ рд╕реЗ рдЖрдкрдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд╛рдЬреНрдп рд╣реИрдВ:
рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА:
рд╕рд╣реА рд╣реИред рдореЙрдбрд▓ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 'рдЬрдЯрд┐рд▓' рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрд░реЛрдз рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣реИред рд╕рд╛рде рд╣реА, рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯрдЕрдк w/рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИ:
<!-- layout -->
<post :post="post"></post>
<author :author="author" ><author>
<comments :comments="comments"></comments>
import post from 'components/post';
import author from 'components/author';
import comments from 'components/comments';
/* post = {
* template: '...'
* props: ['post'],
* data: () => {collapsed: false},
* ...
* }; */
new Vue({
el: 'body',
data() {
instance = postStore.fetch({include: ['author', 'comments.author']})
Vue.nonreactive(instance.cache)
return {post: instance, },
},
components: {
post,
author,
comments,
},
...
});
рдореВрд▓ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ/рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдХ рдореВрд▓ рджреГрд╢реНрдп рд╣реИред рдЪрд╛рдЗрд▓реНрдб рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд▓рд╛рддреЗ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _user's_ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдо _post's_ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреАред
рдореЙрдбрд▓ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрд╛рдлреА 'рдЧреВрдВрдЧрд╛' рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдПрдВ рдиреЗрд╕реНрдЯреЗрдб рдирд╣реАрдВ рд╣реИрдВ ( {post: {author: {}, comments: []}}
), рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреИрд╢ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, post.comments[2].author
рд╡рд╣реА рд╕рдЯреАрдХ рд╡рд╕реНрддреБ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреИрд╕реЗ post.author
ред рдЗрд╕рд▓рд┐рдП, рд▓реЗрдЦрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдХреИрд╢ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рдХреЛрдИ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ - рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдлрд╝реЗрдЪ рдкрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред
рд╕рд╛рде рд╣реА, рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдЕрдм рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рдХрд▓реНрдк 'рдирд┐рдЬреА' рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░рдореБрдЦ рд╕рд┐рдВрдЧрд▓ рдпрд╛ рд╢рд╛рдпрдж рдбрдмрд▓ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╡рд╛рд▓реЗ рд╕рджрд╕реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд╕рд▓рд╛рд╣ рдФрд░ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде vue-nonreactive рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИред
@rpkilby рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
@rpkilby рдПрдХ рддрд░рд╣ рд╕реЗ рдореИрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ
var newObj = JSON.parse(JSON.stringify(obj))
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ "рд░рд╛рдЬреНрдпреЛрдВ" рдХреА рдПрдХ рд╕рд░рдгреА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рд░рд╛рдЬреНрдп рдЗрддрд┐рд╣рд╛рд╕ рд╡рд╕реНрддреБ рдХреЛ vuex рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдпрд╣ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдерд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд╕реНрддреБ рдереА рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рдереАред рдореБрдЭреЗ рд╕рдВрджрд░реНрднреЛрдВ, рдЧрддрд┐рд╢реАрд▓ рдЕрдкрдбреЗрдЯ рдЖрджрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдереАред
рдЕрднреА рд╡рд╕реНрддреБ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдирд╛ рдХреЛрдИ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред [Vue-nonreactive] рдореЗрдВ Vue рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдЖрдЧреЗ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ instance.__ob__ !== false
рдЬреИрд╕реЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рдВрдЪ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧреА? рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ рдХреИрд╢ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рджреЗрдЦреА рдЬрд╛рдПрдВрдЧреАред
class Unobservable {
construtor() {
Object.defineProperty(this, '__ob__', {
enumerable: false, configurable: false,
writable: false, value: false,
});
}
}
рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ Vue рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рд╣реИред
Vue рдХреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреА 1-рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рджреЗрдЦрдиреЗ (рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреИрд╕реЗ рдмрддрд╛рдПрдВ?
рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм data.curObj
рдмрджрд▓ рдЬрд╛рдП рддреЛ Vue рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП,
рд▓реЗрдХрд┐рди curObj.position
, curObj.rotation
, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рди рдХрд░реЗрдВред
рдореИрдВ Object.freeze
, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ рдЬрдм рддреАрди.рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдореБрдЭреЗ рдиреАрдЪреЗ рдХрд░рдирд╛ рд╣реИ?
(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдорд╛рди рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдерд╛)
data () {
return {
wrapper: Object.freeze({
actual: [bigData]
})
}
},
methods: {
operation () {
this.wrapper = Object.freeze({
actual: [newBigData]
})
}
}
// core/observer/watch.js
function _traverse (val: any, seen: ISet) {
let i, keys
const isA = Array.isArray(val)
if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {
return
}
// ...
// core/observer/index.js
export function observe (value: any, asRootData: ?boolean): Observer | void {
if (!isObject(value) || value instanceof VNode) {
return
}
let ob: Observer | void
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
ob = value.__ob__
} else if (
observerState.shouldConvert &&
!isServerRendering() &&
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
) {
ob = new Observer(value)
}
// ...
> curObj PerspectiveCamera {uuid: "BD3C14DF-8C2B-4B96-9900-B3DD0EAC1163", name: "PerspectiveCamera", type: "PerspectiveCamera", parent: null, children: Array(0),┬атАж}
> Lodash.isPlainObject(curObj) false
> Vue.isPlainObject(curObj) true
Object.isExtensible
( Object.freeze
) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╢рд░реНрдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?рдЖрдк рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
var newObj = { ...obj };
рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ isPlainObject рд╡рд┐рдзрд┐ рдХреЛ рдЭреВрдареА рд╡рд╛рдкрд╕реА рдХрд░ рджреЗрдЧрд╛ред
/**
* Makes an object and it's children unobservable by frameworks like Vuejs
*/
class Unobservable {
/**
* Overrides the `Object.prototype.toString.call(obj)` result
* <strong i="6">@returns</strong> {string} - type name
* <strong i="7">@see</strong> {<strong i="8">@link</strong> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag}
*/
get [Symbol.toStringTag]() {
// Anything can go here really as long as it's not 'Object'
return 'ObjectNoObserve';
}
}
>> Object.prototype.toString.call(new Unobservable());
"[object ObjectNoObserve]"
рд╣рд╛рдп рд╕рдм, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЦреЛ рдЧрдпрд╛ рдПрдХ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдбреЗрдЯрд╛ рд╢реБрджреНрдз рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ article
рдЕрдкрдиреЗ author
рдпрд╛ comments
ред рдЬрдм рдореИрдВ article.author
рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЙрд╕ рд╕рдВрдмрдВрдз рдХреИрд╢ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдкрддреНрддрд┐ рд▓реБрдХрдЕрдк рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрд╛рддреЗрдВ:
рдХреБрдЫ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ:
рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдЖрд▓реЛрдЪрдирд╛:
Vue-nonreactive рдореЗрдВ Vue рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдЖрдЧреЗ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░реА рдмрд╛рдд рдХреНрдпреЛрдВ рд╣реЛрдЧреА? рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдкреНрд▓рдЧрдЗрди Vue рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рд░реНрдорд╛рдг рдЙрдкрдХрд░рдг рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ ред рдПрдХ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд░рдирдЯрд╛рдЗрдо рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИред
рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдиреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реА рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдХрдИ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдмрд╕ рдЕрдкрдиреА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд╕реБрдЭрд╛рд╡ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛, рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ Vue рдХреЗ рдЕрд╡рд▓реЛрдХрди рддрд░реНрдХ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ: _рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред_
рдкреГрд╖реНрдарднреВрдорд┐
рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдУрдкрдирд▓реЗрдпрд░) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдХреЛ рд╢реВрд╣реЙрд░реНрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд┐рд░рджрд░реНрдж рд╣реЛ рдЧрдП рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ OpenLayers рдХреЗ рдкрд╛рд╕ рд╡рд╣ рдЪреАрдЬреЗрдВ рд╣реЛрдВ рдЬреЛ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП Vue рдХреЛ рдЗрди рднрдпрд╛рдирдХ рд░реВрдк рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб, uber рдХрдпрд╛рдордд рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдЦреЗрд▓рдирд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореЗрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рдЧрднрдЧ 3 рдЧреАрдЧрд╛ рд░реИрдо (рд╣рдорд╛рд░реЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдпрд╣ рд╕рдм Vue рджреНрд╡рд╛рд░рд╛ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдзреАрдорд╛ рдерд╛ред рдореИрдВрдиреЗ Vue-nonreactive рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реА, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╣рдореЗрдВ рд▓рдЧрднрдЧ 1 рдЧрд┐рдЧ рддрдХ рдиреАрдЪреЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рдЧрднрдЧ 350megs рдкрд░ рдмреИрдард╛ рдерд╛ред
рд╕рдорд╛рдзрд╛рди
рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдХреЗрд╡рд▓ configurable: false
рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред рдпрд╣ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ рдЬрд┐рддрдирд╛:
Object.defineProperty(target, 'nested', { configurable: false });
(рдпрд╣ nested
рд╕рдВрдкрддреНрддрд┐, рдФрд░ рдЗрд╕рдХреА рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред)
рдЗрддрдирд╛ рд╣реА! рдХреЛрдИ Vue рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрдХреАрдирди рдЧрд▓рдд рднреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЖрд╡реЗрджрди 200megs рддрдХ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рд░рд▓ рдФрд░ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ 'рдЖрдзрд┐рдХрд╛рд░рд┐рдХ' рддрд░реАрдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Vue рдХреА рдУрд░ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рджрд┐рд▓рдЪрд╕реНрдк - рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд░реЛрдХрдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░реЛрдк рд╡реЙрдЪрд░ рд╣реИ, рдЗрд╕рдХреЗ рднреАрддрд░ рдореИрдВ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдореИрдВ рдкреВрд░реА рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдбреАрдУрдПрдо рдЕрдкрдбреЗрдЯ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
@intijk рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред рджреЗрдЦрд┐рдП, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ; Vue рдХреЛ рдЕрдВрддрддрдГ рдЖрдкрдХреЗ рд░рд╛рдЬреНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдмрд╕ рд░реБрдХрдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред рдпрджрд┐, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдордзреНрдпрд╡рд░реНрддреА рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдВрдд рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рд╕реНрдпреВрдбреЛрдХреЛрдб):
doUpdate()
{
const state = _.cloneDeep(this.myState);
// Do intermediate state updates
this.myState = state;
}
(рдСрдмреНрдЬреЗрдХреНрдЯ рд░рд┐рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп Vue рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВред)
рдореЗрд░реА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реЛрдЧреА рдХрд┐ рдЙрдкрд░реЛрдХреНрдд configurable
рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдмрдбрд╝реА рд╡рд╕реНрддреБ рдХреЗ рдЙрди рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдм _does_ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ vuex
рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред
@ рдореЛрд░реНрдЧреБрд▓ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЯреНрд░рд┐рдХ рдХрд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдм рдЗрд╕ рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдм рдПрдХ рддрд░рд╣ рдХрд╛ рдмрдбрд╝рд╛ рд╣реИ, 2M рд╕реЗ 100M рддрдХ, рдРрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдбреАрдк рдХреЙрдкреА рдХрд░рдирд╛ рдХрд╛рдлреА рджрд░реНрджрдирд╛рдХ рд╣реИред
@intijk рдЬреЛ рдХреБрдЫ рдХреЗ рд▓рд┐рдП Vue рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ?
@ рдореЛрд░реНрдЧреБрд▓
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдорд╛рдорд▓рд╛ рдЬрдЯрд┐рд▓ рд╣реИ, рдорд╛рдорд▓рд╛ рд╣реА рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдбреЗрдЯрд╛ рдмрдбрд╝рд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреБрдЫ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдШрдЯрдХ рд╣реИред
рдХрд┐рд╕реА рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рднреАрддрд░ рдПрдХ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╕рд░рдгреА рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ...
template: '<div v-html="markdown.render(input, env)"></div>',
props: ['id', 'input'],
computed: {
env: function() { return { reactive:this.id, non_reactive:[] } },
markdown: function() { return Markdown },
},
// within markdown.render():
env.non_reactive[0] = internal_data;
рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ :-)
рд╣реЗ рд▓реЛрдЧреЛрдВред рдореБрдЭреЗ рдЕрднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЖрд░рдкреАрдХрд┐рд▓реНрдмреА рдХреА рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рд╣реИ: рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ Vue Virtual DOMs (рдпрд╛ vnode рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреА рд╣реИред рдореИрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд╡реИрд╕реЗ рднреА, рдпрд╣ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдореИрдВ рдЗрд╕ JSON рдХрд╛ рдЙрдкрдпреЛрдЧ Vue рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЗрд╕реЗ Vue рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ рдЖрд░рдкреАрдХрд┐рд▓рдмреА рдФрд░ рдореЛрд░реНрдЧреБрд▓ рдХреЗ рддрд░реАрдХреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред (рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдореИрдВ рдПрдХ рдЯреАрдо рдореЗрдВ рд╣реВрдВ, рдЬрдмрдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рд╡реАрдпреВ рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╢рд╛рдпрдж рдЬреЗрдПрд╕рдУрдПрди рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдореЗрд░рд╛ рд╡реАрдпреВ рд╕рдВрд╕реНрдХрд░рдг 2.5.16 рд╣реИред ) рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ Vue рдЯреНрд░реИрд╡рд░реНрд╕ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╕рдорд╛рд░реЛрд╣ _traverse (рд╡реИрд▓, рджреЗрдЦрд╛) {
рд╡рд░ рдореИрдВ, рдЪрд╛рдмрд┐рдпрд╛рдБ;
рд╡рд░ isA = Array.isArray (рд╡реИрд▓);
рдЕрдЧрд░ ((!isA && !isObject(val)) || Object.isFrozen(val) || VNode рдХрд╛ рд╡реИрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕
|| (рд╡реИрд▓ && рд╡реИрд▓ ['__vueNonReactive__'])) {
рд╡рд╛рдкрд╕реА
}
...
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ "val && val['__vueNonReactive__']" рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред рдлрд┐рд░ рдореИрдВ JSON рдХреЗ рд░реВрдЯ рдиреЛрдб рдХреЗ рд╕рд╛рде "__vueNonReactive__ = true" рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ? рдФрд░ рдХреНрдпрд╛ рдЗрд╕реЗ Vue рдореЗрдВ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ Vue рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ? (рдСрдмреНрдЬреЗрдХреНрдЯ.рдлреНрд░реАрдЬрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛)
рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ https://github.com/vuejs/vue/blob/v2.5.16/src/core/observer/index.js#L121
рд╕реЗрдЯ val._isVue = true
vue рдирд┐рд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЬ рдореИрдВ рдПрдХ рдорд╛рдорд▓реЗ рд╕реЗ рдорд┐рд▓рд╛ рдХрд┐, Vue mapbox-gl рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рд╣реБрдИрдВ, рдирдХреНрд╢рд╛ рд╣рд▓реНрдХрд╛ рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ Vue рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ map._isVue = true
рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП +1ред рдореИрдВ рдПрдХ рдмрдбрд╝реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдШрдЯрдХ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ 800 рдПрдордмреА рд╕реЗ 43 рдПрдордмреА рддрдХ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ
рдореИрдВ рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП @magicdawn рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @Mechazawa рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред
__ob__
рдХреЗ configurable
рдХреЛ рдЭреВрдареЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЬрдм рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ __ob__
рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ Vue рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдПрдХ Vue рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ Vue рдЪрд░ рдХреЛ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ (рдпрд╣ рдкрд╣рд▓реЗ рдХреЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред
рдпрд╣ vue- nonreactive - рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рджреЗрдЦреЗрдВ - рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди Vue рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЪрд░ рдХреЛ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ Vue-Static рджреЗрдЦреЗрдВ ред
<script>
export default {
static() {
return {
map: null,
};
},
mounted() {
this.map = new mapboxgl.Map({...}); /* something heavy */
},
};
</script>
рд╣рд╛рдп @samuelantonioli - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ vue-static рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, vue-nonreactive рдПрдХ рдПрдХрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдЬрдмрдХрд┐ рд╢реЗрд╖ рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░рдЦрддрд╛ рд╣реИред
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд░рд╛рджреЗ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╣реИрдВред рд╕реНрдереИрддрд┐рдХ рдЧреБрдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЧреБрдг рджреЗрдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рди рд╣реА рдЙрдирдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдореЙрдбрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╢ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реБрдХрдЕрдк рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ instance
рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд instance.author
рдХреЛ рджреЗрдЦрдирд╛/рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди instance._cache
ред
new Vue({
data() {
const instance = postStore.fetch({include: ['author', 'comments.author']})
Vue.nonreactive(instance._cache)
return {post: instance, },
},
...
});
рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рд╕рд┐рд░ рдКрдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдЧрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ/рдкреНрд░реЙрдХреНрд╕реА рдирд┐рд░реНрдорд╛рдг рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
@LinusBorg - рдореБрдЭреЗ рдПрдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╢рд╛рдЦрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдХрд╣рд╛рдБ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рд╣рдо рдЕрднреА рднреА рд╡рд╣ рдЕрд╡рдзрд╛рд░рдгрд╛/рдкреНрд░рдпреЛрдЧ рдЪрд░рдг рд╣реИрдВ рдФрд░ рдЕрднреА рддрдХ рдПрдХ рд╢рд╛рдЦрд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХреА рд╣реИред рдЗрд╕ рдкрд░ рдЧрдВрднреАрд░ рдХрд╛рдо рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2.6 рдЕрдкрдбреЗрдЯ рджрд░рд╡рд╛рдЬреЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ, рдЬреЛ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬрд▓реНрдж рд╣реА рд╡реАрдпреВ-рдХреНрд▓реА 3.0 рдЖрдЙрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ ES6 рдкреНрд░реЙрдХреНрд╕реА рдкреЗрд╢ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╕реНрдпрд╛ рдЙрд╕реА рджрд╛рдпрд░реЗ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдореИрдВ рдЙрдирдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЙрдирдХреЗ рдУрд╡рд░рд╣реЗрдб рдмрдирд╛рдо рд╡реВ рдХреЗ рд╡рд░реНрддрдорд╛рди рдЕрд╡рд▓реЛрдХрди рдХреЗ рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд▓рдЧрддрд╛ рд╣реИред рд╢реИрддрд╛рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реЛрдЧрд╛, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ Vue-Static
рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ JS рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрд╕реЗ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЙрд╕рдХрд╛ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ; рдЪреВрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдорд╛рди рдХрднреА рднреА рдкреБрдирд░реНрдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░, рдпрд╣ рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдмреЗрд╣рддрд░ рдЕрд▓рдЧрд╛рд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдкрдиреЗ vue рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдореЗрдВ, рдЧреБрдгреЛрдВ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдЪрд╛рд▓ рдЕрднреА рднреА рдХрдо рд╕реЗ рдХрдо рдЖрдХреНрд░рд╛рдордХ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо Vue рдирд┐рд░реНрднрд░ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ ES рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛; рдЖрдк рдЕрднреА рднреА рд╢рд╛рдпрдж рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЧреБрдгреЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо _know_ __ob__
рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ... рд╣рдо рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред
рд╕рд╛рде рд╣реА, рдпрд╣ 8+ рдорд╣реАрдиреЛрдВ рд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдбрдХреНрд╢рди рдХреЛрдб рдореЗрдВ рдПрдХ рд╡рд┐рдЬреЗрддрд╛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред ;) (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ @samuelantonioli рдХреЗ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╕реНрдерд╛рди рд╣реИ; рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ OpenLayers рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ Vue рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмрд┐рдирд╛ Vue рдЧреБрдмреНрдмрд╛рд░реЗ рдХреЗ рд╣рдорд╛рд░реА рдореЗрдореЛрд░реА 2.4 gigs ...)
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдпрд╛рдд рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ Vue-Static рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдмрд╕ рдПрдХ рдРрд╕рд╛ рдкреИрдЯрд░реНрди рдЪрд╛рд╣рд┐рдП рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд╕рд┐рдЦрд╛ рд╕рдХреВрдВ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдордЭрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛред рдЖрдпрд╛рдд-рдореЙрдбреНрдпреВрд▓-рдФрд░-рдЙрдкрдпреЛрдЧ-рдЧрдгрдирд╛-рдЧреБрдг рдкреИрдЯрд░реНрди рд╕реНрдкрд╖реНрдЯ рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реИред
рдереЛрдбрд╝рд╛ рд╕рд╛ рдУрдЯреА: рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ ES6 рдкреНрд░реЙрдХреНрд╕реА рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ (рдЖрдИрдИ 11 рдФрд░ рдиреАрдЪреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдЕрдЧрд░ рдХреЛрдИ рд╕рдВрдЧрддрддрд╛ рдкрд░рдд/рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдкреЙрд▓реАрдлрд┐рд▓ рд╣реЛрдЧреА рддреЛ рд╣рдо рдХрдареЛрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Vue рдХреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреА 1-рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рджреЗрдЦрдиреЗ (рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреИрд╕реЗ рдмрддрд╛рдПрдВ?
рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП +1, рдмрд╛рд╣рд░реА рдЧреНрд░рд╛рдлрд┐рдХ рд▓рд┐рдм (рдЬрд┐рд╕рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБ-рд╕реНрддрд░реАрдп рдиреЗрд╕реНрдЯреЗрдб рдмрдбрд╝реА рд╡рд╕реНрддреБрдПрдВ рд╣реЛрддреА рд╣реИрдВ) рдХреЗ рд╕рд╛рде Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рдВрдкрддреНрддрд┐рдирд╛рдо = {/* рдпрд╣рд╛рдВ рдХреБрдЫ рдмрдбрд╝рд╛ */};
рдорд╛рдЙрдВрдЯреЗрдб () рд╣реБрдХ рдореЗрдВ рдЧреИрд░-рдордирд╛рдП рдЧрдП рдЧреБрдгреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ?
рд╣рд╛рдп @vlahanasред рджреЗрдЦреЗрдВ https://github.com/vuejs/vue/issues/2637#issuecomment -403630456ред
рд╕реЗрдЯ _isVue
vue-devtool рдХреНрд░реИрд╢ рдХрд░ рджреЗрдЧрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
export default function setIsVue(val) {
if (!val) return
Object.defineProperty(val, '_isVue', {
value: true,
enumerable: false,
configurable: true,
})
// vue-devtool
// https://github.com/vuejs/vue-devtools/blob/c309065c57f6579b778341ea37042fdf51a9fc6c/src/backend/index.js#L616
// хЫаф╕║цЬЙ _isVue х▒ЮцАз
if (process.env.NODE_ENV !== 'production') {
if (!val.$options) {
Object.defineProperty(val, '$options', {
value: {},
enumerable: false,
configurable: true,
})
}
if (!val._data) {
Object.defineProperty(val, '_data', {
value: {},
enumerable: false,
configurable: true,
})
}
}
return val
}
рдпрд╣ рд╢реЛрд░ рдореЗрдВ рдЦреЛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд┐рдХреНрд╕ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред
Object.keys(scene).forEach((key)=>{
Object.defineProperty(target, 'nested', { configurable: false });
});
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ THREE.Scene
рдЖрд╕рдкрд╛рд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд╕рдЪрдореБрдЪ рд╕рдВрдкреВрд░реНрдг рджреГрд╢реНрдп рдЧреНрд░рд╛рдлрд╝ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдмрди рдЬрд╛рдПред рдФрд░ рдлрд┐рд░ рдореИрдВ рдЕрднреА рднреА рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрддреНрддрдо!
рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдЧреБрдгреЛрдВ рдХреЗ рдХрдИ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрддрд░ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рднрд▓реЗ рд╣реА рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ
рдпрд╣ рд╢реЛрд░ рдореЗрдВ рдЦреЛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд┐рдХреНрд╕ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред
Object.keys(scene).forEach((key)=>{ Object.defineProperty(target, 'nested', { configurable: false }); });
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ
THREE.Scene
рдЖрд╕рдкрд╛рд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд╕рдЪрдореБрдЪ рд╕рдВрдкреВрд░реНрдг рджреГрд╢реНрдп рдЧреНрд░рд╛рдлрд╝ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдмрди рдЬрд╛рдПред рдФрд░ рдлрд┐рд░ рдореИрдВ рдЕрднреА рднреА рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрддреНрддрдо!
рдпрд╛
рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ https://github.com/vuejs/vue/blob/v2.5.16/src/core/observer/index.js#L121
рд╕реЗрдЯval._isVue = true
vue рдирд┐рд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИредрдЖрдЬ рдореИрдВ рдПрдХ рдорд╛рдорд▓реЗ рд╕реЗ рдорд┐рд▓рд╛ рдХрд┐, Vue mapbox-gl рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рд╣реБрдИрдВ, рдирдХреНрд╢рд╛ рд╣рд▓реНрдХрд╛ рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ Vue рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛
map._isVue = true
рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред
рдиреЗрд╕реНрдЯреЗрдб рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЧреБрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди Maximum call stack size exceeded
, рдФрд░ рдпрд╣ рдЕрдзрд┐рдХ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
@Mitroright рдЖрдкрдХреЛ рдЗрд╕реЗ
рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ Vue Arrays рдХреЛ рдХреИрд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ; рдмрд╕ geoJsonData
рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ (рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА рднреА 'рдХреНрдпреЛрдВ' рдореЗрдВ рдЦреЛрд▓рд╛ рдирд╣реАрдВ рдЧрдпрд╛ред)
рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
function makeArrayNonConfigurable(objects)
{
objects.forEach((obj) =>
{
Object.keys(obj).forEach((key) =>
{
Object.defineProperty(obj, key, { configurable: false });
});
});
}
рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд░рдирд╛ рд╣реИ; Vue рдиреЗрд╕реНрдЯреЗрдб рд╡рд╕реНрддреБ рдЧреБрдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдЧреБрдгреЛрдВ рдкрд░ рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рджреЗрдЦрдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред
рдЕрдм, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ 10,000 рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реЗрдХрдВрдб рдпрд╛ рддреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордВрдерди рд╣реЛрдЧрд╛; рдЗрд╕реЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдореИрдВ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ (рдореИрдВ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рджреЗрддрд╛ рд╣реИ), рдФрд░ рдлрд┐рд░ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЬреАрд╡рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд▓реЛрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ- рдЕрд╡рдзрд┐ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рд╡рд┐рд╡рд░рдг рд╣реИ, рдФрд░ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рдпрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛:
https://medium.com/@deadbeef404/tell -vue-js-to-stop-wasting-time-and-render-faster-7c3f7d2acaab
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдп рдХрд░реЗрдВ:
import Vue from 'vue';
const Observer = (new Vue()).$data.__ob__.constructor;
export function makeNonreactive(obj) {
obj.__ob__ = new Observer({});
}
рд╣рд╛рдп @Mitorightред рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ vue-nonreactive
рдХреА рд╣рд┐рдореНрдордд рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХреЛрдб рдХреЛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ( vue-nonreactive
рдорд╛рдзреНрдпрдо рд╕реЗ) рдпрд╛ рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВред рд╕рд╛рде рд╣реА, vue-nonreactive
рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдареАрдХ рдКрдкрд░ рдЕрджреНрдпрддрди рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЬреИрд╕реЗ рд╣реА vue-devtool рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрдкрдбреЗрдЯ рдорд┐рд▓рд╛, https://github.com/vuejs/vue/issues/2637#issuecomment -434154442 рдлрд┐рд░ рд╕реЗ vue-devtool рдХреНрд░реИрд╢ рдХрд░ рджреЗрдЧрд╛ред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ vue-nonreactive
рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди
__ob__
рдХреЛрдИ рднреА рдЧрдгрдирд╛ рдпреЛрдЧреНрдп рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, defineProperty
vue-free.js
import Vue from 'vue'
const Observer = new Vue().$data.__ob__.constructor
function prevent(val) {
if (val) {
// Set dummy observer on value
Object.defineProperty(val, '__ob__', {
value: new Observer({}),
enumerable: false,
configurable: true,
})
}
return val
}
// vue global
Vue.VUE_FREE = prevent
// window
global.VUE_FREE = prevent
// default export
export default prevent
рдЪрд┐рддреНрд░рд╛ рдореИрдВ рдЗрд╕ рдкрд░ рдЕрдкрдирд╛ 2 рд╕реЗрдВрдЯ рдФрд░ рд╕рдорд╛рдзрд╛рди рджреВрдВрдЧрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдлреНрд░реАрдЬ рдЕрд╡рдзрд╛рд░рдгрд╛ рдФрд░ рдирдХрд▓реА рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рдореБрджреНрджреЗ рднреА рдереЗред рдореЗрд░рд╛ рдбреЗрдЯрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЯреНрд░реАрдиреЛрдб рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ, рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ vuex рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИ рдЬрд┐рд╕рдиреЗ рджреЗрдЦреЗ рдЧрдП рдореБрджреНрджреЛрдВ рдореЗрдВ рдПрдХ рдкрд░рдд рдЬреЛрдбрд╝ рджреА рд╣реИред рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ Maximum call stack size exceeded
vues object.keys рд▓реВрдк рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдирдХрд▓реА рд╡реАрдПрдирдУрдб рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдХреЛ рдлреНрд░реАрдЬ рдФрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рди рддреЛ рд░рд┐рдХрд░реНрд╕рди рдореБрджреНрджреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рдерд╛ред
рдореИрдВ рдЕрдВрдд рдореЗрдВ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рд░рд┐рд╡реАрд▓рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ "рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓" рдЧреБрдгреЛрдВ рдХреЛ рд▓рдкреЗрдЯ рд▓рд┐рдпрд╛
рдпрд╣ рд╡рд░реНрдЧ (ES6/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ) рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рд╛рджреЗ рджреГрд╢реНрдп рдореЗрдВ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
import { first, forEach } from 'lodash';
export class TreeNode {
internalRefsInstance: () => { getParent: () => TreeNode; setParent: (parent: TreeNode) => void; getChildNodes: () => TreeNode[]; setChildNode: (childNode: TreeNode) => number; };
get visitedDate(): string | undefined {
return this._visitedDates.get(this.id) || undefined;
}
isSelectedTreeNode: boolean = false;
showSubheader: boolean = false;
showHelp: boolean = false;
treeNodeIconName: string = 'empty';
childTreeNodeCount: number = 0;
constructor(public id: string,
public componentName: string,
private _visitedDates: Map<string, string>,
public isActive: boolean = true,
public nextFlow?: string,
public prevFlow?: string,
parent: TreeNode | undefined = undefined) {
//invoke the internal refs module to create our static instance func to get the values from
this.internalRefsInstance = this.nonReactiveModule();
this.internalRefsInstance().setParent(parent);
}
nonReactiveModule = () => {
let _parent: TreeNode | undefined = undefined;
let _childNodes: TreeNode[] = [];
const _getParent = (): TreeNode | undefined => {
return _parent;
};
const _setParent = (parent: TreeNode | undefined): void => {
_parent = parent;
};
const _getChildNodes = (): TreeNode[] => {
return _childNodes || [];
};
const _setChildNode = (childNode: TreeNode): number => {
if (!_childNodes) {
_childNodes = [];
}
_childNodes.push(childNode);
return _childNodes.length;
};
const returnObj = {
getParent: _getParent,
setParent: _setParent,
getChildNodes: _getChildNodes,
setChildNode: _setChildNode,
};
return () => { return returnObj; };
}
getParent(): TreeNode | undefined {
return this.internalRefsInstance().getParent();
}
getChildNodes(): TreeNode[] {
return this.internalRefsInstance().getChildNodes();
}
setChildNode(childFlow: TreeNode): void {
this.childTreeNodeCount = this.internalRefsInstance().setChildNode(childFlow);
}
clone(parent: TreeNode | undefined = undefined): TreeNode {
const newInstance = new TreeNode(this.id, this.componentName, this._visitedDates, this.isActive, this.nextFlow, this.prevFlow, parent);
newInstance.showHelp = this.showHelp;
newInstance.showSubheader = this.showSubheader;
newInstance.isSelectedTreeNode = this.isSelectedTreeNode;
forEach(this.getChildNodes(), (flow: TreeNode) => {
newInstance.childTreeNodeCount = newInstance.internalRefsInstance().setChildNode(flow.clone(newInstance));
});
return newInstance;
}
setVisitedDates(visitedDates: Map<string, string>): void {
this._visitedDates = visitedDates;
forEach(this.getChildNodes(), (flow: TreeNode) => {
flow.setVisitedDates(visitedDates);
});
}
setAsSelected(setParent: boolean = true, setAllFirstChildren: boolean = true): void {
this.isSelectedTreeNode = true;
if (setAllFirstChildren) {
const firstChildFlow = first(this.getChildNodes());
if (firstChildFlow) {
firstChildFlow.setAsSelected(false, true);
}
}
if (setParent && this.getParent()) {
this.getParent()!.setAsSelected(setParent);
}
}
resetSelected(resetChildren: boolean = true): void {
this.isSelectedTreeNode = false;
if (resetChildren) {
forEach(this.getChildNodes(), (flow: TreeNode) => {
flow.resetSelected(resetChildren);
});
}
}
}
рдЧрдгрдирд╛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдкреВрд░реНрдг рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдореБрдЭреЗ рдЧрдгрдирд╛ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рднреЗрдЬ рд░рд╣рд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдЕрдЧрд░ рдореИрдВ рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рд╕рдмрд╕реЗрдЯ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЧрд╣рд░рд╛ рджреНрд░рд╖реНрдЯрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рддрдХ рд▓реЗ рдЬрд╛рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬреЗрдХреНрд╢рди рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рд╣рд╛рдпрдХ рдпрд╛ рд╕рдЬрд╛рд╡рдЯреА рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдлрд╝реАрдбрдмреИрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ,
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк https://github.com/vuejs/vue/issues/4384 рдкрд░ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ
рдирдорд╕реНрддреЗ, рдореИрдВрдиреЗ #10265 рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдереАред
рдореИрдВ рдмрд╕ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдмреВрдд рд╣реЛрдиреЗ рдФрд░ Vue рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЬрдм рдпрд╣ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП Object.defineProperty
рдХреЗ рд╕рд╛рде configurable: false
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдиреЗ рдореМрдЬреВрджрд╛ рд╕реЗрдЯрд░ / рдЧреЗрдЯрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ)ред
рдХреНрдпрд╛ рдпрд╣ рддрдХрдиреАрдХ рдЕрднреА рднреА Vue 3 рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдпреЛрдЧреНрдп рд╣реЛрдЧреА?
рдзрдиреНрдпрд╡рд╛рдж
@ рдХреЙрд▓рд┐рди-рдЧрд╛рдпреЙрди configurable: false
рд╢рд╛рдпрдж _not_ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/vuejs/vue-next/blob/d9c6ff372c10dde8b496ee32f2b9a246edf66a35/packages/reactivity/src/reactive.ts#L159 . рдпрджрд┐ рдпрд╣ Vue 3.x рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ API рд╣реЛрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд Vue.observable
, рдЬрдм рдХреЛрдИ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд┐рд╕реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБ рдкрд░ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ _new_ рдорд╛рди рджрд╛рдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, _getter_ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЙрдХреНрд╕реА рд▓реМрдЯрд╛рдПрдЧрд╛, рдЕрдЧрд░ рдпрд╣ рдХреИрд╢ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рдПрдХ рдмрдирд╛ рджреЗрдЧрд╛ред
рдПрдХ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐, рдЬрдм рддрдХ рдЖрдк _that_ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЙрдХреНрд╕реА рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдореЗрдореЛрд░реА рд╣реЙрдЧ рдпрд╛ рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╕реНрддреБ рдЬреЛ рднреА рд╣реЛ - рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХреЛрдИ рд╡рд┐рджреЗрд╢реА рд╡рд╕реНрддреБ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ, рдЙрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рд▓рд╛рдЧреВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ - _рдХреБрдЫ рдирд╣реАрдВ_ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдЦрд┐рд░ рдЫреБрдЖ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ Vue 3.x рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреНрдпрдерд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред
рдлрд┐рд▓рд╣рд╛рд▓, vue-next
рдХреЛрдб рдкреНрд░рддреАрдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ Vue рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ https://github.com/vuejs/vue/blob/v2.5.16/src/core/observer/index.js#L121
рд╕реЗрдЯval._isVue = true
vue рдирд┐рд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИредрдЖрдЬ рдореИрдВ рдПрдХ рдорд╛рдорд▓реЗ рд╕реЗ рдорд┐рд▓рд╛ рдХрд┐, Vue mapbox-gl рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рд╣реБрдИрдВ, рдирдХреНрд╢рд╛ рд╣рд▓реНрдХрд╛ рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ Vue рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛
map._isVue = true
рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред
рдореИрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рддрдХ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдореБрдЭреЗ Vue dev рдЯреВрд▓реНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдЯ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ _isVue
рд╕рдЪ рд╣реИ рдФрд░ рдпрд╣ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ Vue рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред
рдПрдХрдорд╛рддреНрд░ рд╣реИрдХ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЧрдВрднреАрд░ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХреЗ рджреЗрдЦрд╛ рд╣реИ, рд╡рд╣ vue-nonreactive
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдУрдкреА рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП V3 рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ?
@HunderlineK рдЙрдерд▓реЗрд░рдл, рдЙрдерд▓рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓, рдорд╛рд░реНрдХрд░реЙ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
data
, рдХрд╛ рдЙрдкрдпреЛрдЧObject.freeze()
рдЙрд╕ рдкрд░;data
рдкрд░ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдПthis
ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓this
рдХреЗ рд╕рд╛рдеcreated()
рд╣реБрдХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред