শুধু একটি দ্রুত প্রশ্ন।
আপনি কি সবকিছু পুনরায় লোড / পুনরায় গণনা করতে বাধ্য Vue.js
করতে পারেন ? যদি তাই হয়, কিভাবে?
শুধু একটি দ্রুত প্রশ্ন।
আপনি কি সবকিছু পুনরায় লোড / পুনরায় গণনা করতে বাধ্য Vue.js
করতে পারেন ? যদি তাই হয়, কিভাবে?
উত্তর:
এই যাদু বানান চেষ্টা করুন:
vm.$forceUpdate();
কোনও ঝুলন্ত ভার তৈরি করার দরকার নেই :)
আপডেট: যখন আমি কেবল ভ্যুজেএস-এর সাথে কাজ শুরু করি তখন আমি এই সমাধানটি পেয়েছি। তবে আরও অনুসন্ধানের ফলে ক্র্যাচ হিসাবে এই পদ্ধতির প্রমাণিত হয়েছিল। যতদূর আমি স্মরণ করি, কিছুক্ষণের মধ্যে আমি এ থেকে মুক্তি পেয়েছি যা স্বয়ংক্রিয়ভাবে রিফ্রেশ করতে ব্যর্থ সমস্ত বৈশিষ্ট্য (বেশিরভাগ নেস্টেড ব্যক্তিদের) গণিত বৈশিষ্ট্যগুলিতে ফেলে দেয়।
এখানে আরও তথ্য: https://vuejs.org/v2/guide/computes.html
$forceUpdate()
কখনও কখনও আমার জন্য 2.5.17 এ কাজ করেনি।
এই থেকে একটি প্রশংসনীয় পরিষ্কার সমাধান মত মনে হয় matthiasg উপর এই সমস্যা :
আপনি
:key="someVariableUnderYourControl"
যখন পুনঃনির্মাণের উপাদানটি চান তখন আপনি কীটিও ব্যবহার করতে এবং পরিবর্তন করতে পারেন
আমার ব্যবহারের ক্ষেত্রে, আমি প্রোপ হিসাবে কোনও উপাদানগুলিতে একটি ভয়েস গেটরকে খাওয়াতাম। কোনওভাবে ভুেক্স ডেটা আনবে তবে প্রতিক্রিয়াটি নির্ভরযোগ্যভাবে উপাদানটি পুনরায় রেন্ডার করতে সক্ষম হবে না। আমার ক্ষেত্রে, প্রাপগুলিতে key
কিছু বৈশিষ্ট্যের সাথে উপাদানটি সেট করা যখন গ্রাহকরা (এবং বৈশিষ্ট্য) অবশেষে সমাধান হয় তখন রিফ্রেশের গ্যারান্টি দেয়।
mounted
চালানো হবে ইত্যাদি)
... আপনার একটি আপডেট জোর করা প্রয়োজন ?
সম্ভবত আপনি ভিউকে সেরাটি আবিষ্কার করছেন না:
মান পরিবর্তনের ক্ষেত্রে ভ্যুটি স্বয়ংক্রিয়ভাবে প্রতিক্রিয়া দেখাতে অবশ্যই অবজেক্টগুলিকে প্রাথমিকভাবে ঘোষণা
data
করতে হবে । অথবা, যদি না হয় তবে সেগুলি অবশ্যই ব্যবহার করে যুক্ত করাVue.set()
উচিত ।
নীচে ডেমো মন্তব্য দেখুন। বা এখানে একটি জেএসফিডেলে একই ডেমোটি খুলুন ।
new Vue({
el: '#app',
data: {
person: {
name: 'Edson'
}
},
methods: {
changeName() {
// because name is declared in data, whenever it
// changes, Vue automatically updates
this.person.name = 'Arantes';
},
changeNickname() {
// because nickname is NOT declared in data, when it
// changes, Vue will NOT automatically update
this.person.nickname = 'Pele';
// although if anything else updates, this change will be seen
},
changeNicknameProperly() {
// when some property is NOT INITIALLY declared in data, the correct way
// to add it is using Vue.set or this.$set
Vue.set(this.person, 'address', '123th avenue.');
// subsequent changes can be done directly now and it will auto update
this.person.address = '345th avenue.';
}
}
})
/* CSS just for the demo, it is not necessary at all! */
span:nth-of-type(1),button:nth-of-type(1) { color: blue; }
span:nth-of-type(2),button:nth-of-type(2) { color: red; }
span:nth-of-type(3),button:nth-of-type(3) { color: green; }
span { font-family: monospace }
<script src="https://unpkg.com/vue"></script>
<div id="app">
<span>person.name: {{ person.name }}</span><br>
<span>person.nickname: {{ person.nickname }}</span><br>
<span>person.address: {{ person.address }}</span><br>
<br>
<button @click="changeName">this.person.name = 'Arantes'; (will auto update because `name` was in `data`)</button><br>
<button @click="changeNickname">this.person.nickname = 'Pele'; (will NOT auto update because `nickname` was not in `data`)</button><br>
<button @click="changeNicknameProperly">Vue.set(this.person, 'address', '99th st.'); (WILL auto update even though `address` was not in `data`)</button>
<br>
<br>
For more info, read the comments in the code. Or check the docs on <b>Reactivity</b> (link below).
</div>
ভিউয়ের এই অংশটি আয়ত্ত করতে, পুনরায় কার্যকারিতা সম্পর্কিত সরকারী দস্তাবেজগুলি দেখুন - সনাক্তকরণ ক্যাভেটগুলি পরিবর্তন করুন । এটা অবশ্যই পড়তে হবে!
Vue.set()
এটি উপাদানগুলির ভিতরেও কাজ করে।
দয়া করে এই পড়া http://michaelnthiessen.com/force-re-render/
ভয়াবহ উপায়: পুরো পৃষ্ঠাটি পুনরায় লোড করা ভয়ঙ্কর উপায়:
ভি-ইফ হ্যাক ব্যবহার করে
আরও ভাল উপায়: ভের অন্তর্নির্মিত বাহিনীটি ব্যবহার করে আপলোড পদ্ধতি
সবচেয়ে ভাল উপায়: আপনার উপাদানটিতে কী-পরিবর্তনশীল
<template>
<component-to-re-render :key="componentKey" />
</template>
<script>
export default {
data() {
return {
componentKey: 0,
};
},
methods: {
forceRerender() {
this.componentKey += 1;
}
}
}
</script>
আমি ঘড়িও ব্যবহার করি: কিছু পরিস্থিতিতে।
ব্যবহার vm.$set('varName', value)
। চেঞ্জ_ডেটিশন_ ক্যাভেটসের বিবরণ সন্ধান করুন ।
অবশ্যই .. আপনি যেকোন সময় পুনরায় রেন্ডার (বিনোদন) জোর করতে মূল বৈশিষ্ট্যটি ব্যবহার করতে পারেন।
<mycomponent :key="somevalueunderyourcontrol"></mycomponent>
উদাহরণের জন্য https://jsfiddle.net/mgoetzke/epqy1xgf/ দেখুন
এটি এখানেও আলোচনা করা হয়েছিল: https://github.com/vuejs/ ডিসকাসশন / গ্লোবস / 356#issuecomment-336060875
<my-component :key="uniqueKey" />
পাশাপাশি এটি প্রতিটি আপডেটের জন্য অবজেক্ট (আপত্তি) মূল্যে প্রতিটি this.$set(obj,'obj_key',value)
আপডেটের uniqueKey
জন্য ব্যবহার এবং আপডেট করেthis.uniqueKey++
এটি আমার পক্ষে এভাবে কাজ করেছিল
সুতরাং আপনি এটি করতে পারেন দুটি উপায় আছে,
1)। আপনি $forceUpdate()
আপনার পদ্ধতির হ্যান্ডলারের অভ্যন্তরে ব্যবহার করতে পারেন
<your-component @click="reRender()"></your-component>
<script>
export default {
methods: {
reRender(){
this.$forceUpdate()
}
}
}
</script>
2)। আপনি একটি দিতে পারে :key
যখন rerender করতে চান আপনার কম্পোনেন্ট এবং increament করার অ্যাট্রিবিউট
<your-component :key="index" @click="reRender()"></your-component>
<script>
export default {
data() {
return {
index: 1
}
},
methods: {
reRender(){
this.index++
}
}
}
</script>
ভি-ইফ ডাইরেক্টিভ ব্যবহার করে
<div v-if="trulyvalue">
<component-here />
</div>
সুতরাং সহজেই সত্য থেকে সত্যের মানটি মিথ্যা থেকে সত্যে পরিবর্তনের মাধ্যমে ডিভের মধ্যে থাকা উপাদানটিকে আবার রেন্ডার করতে হবে
পুনরায় লোড / পুনঃ-রেন্ডার / রিফ্রেশ উপাদানটি লম্বা কোডিং বন্ধ করুন। এটি করার একটি ভ্যু.জেএস উপায় আছে।
শুধু :key
বৈশিষ্ট্য ব্যবহার করুন ।
উদাহরণ স্বরূপ:
<my-component :key="unique" />
আমি বিএস ভ্যু টেবিল স্লটে এটি ব্যবহার করছি। বলছি যে আমি এই উপাদানটির জন্য কিছু করব তাই এটি অনন্য করে তুলুন।
আমি একটি উপায় খুঁজে পেয়েছি। এটি কিছুটা হ্যাকি কিন্তু কাজ করে।
vm.$set("x",0);
vm.$delete("x");
vm
আপনার ভিউ-মডেল অবজেক্টটি কোথায় এবং x
অস্তিত্বের পরিবর্তনশীল।
Vue.js কনসোল লগ এ সম্পর্কে অভিযোগ করবে কিন্তু এটি সমস্ত ডেটা জন্য রিফ্রেশ ট্রিগার করে। 1.0.26 সংস্করণ দিয়ে পরীক্ষা করা হয়েছে।
শুধু এই কোড যুক্ত করুন:
this.$forceUpdate()
গুডলাক
: কী = "$ রুট.প্রেমস.প্রেম 1" আপনার যে কোনও প্যারামের সাথে স্বয়ংক্রিয় পুনরায় লোড করা বাচ্চাদের সাথে কী ব্যবহার করুন ..
আমি একটি ইমেজ গ্যালারী নিয়ে এই সমস্যাটি নিয়েছিলাম যা অন্য ট্যাবে পরিবর্তিত হওয়ার কারণে আমি রেন্ডার করতে চেয়েছিলাম। সুতরাং ট্যাব 1 = চিত্রগ্যালারি, ট্যাব 2 = প্রিয় ছবি
ট্যাব @ চেঞ্জ = "আপডেটগ্যালারি ()" -> প্রতিবার আমি ট্যাবগুলি স্যুইচ করে ফিল্টারড ইমেজ ফাংশনটি প্রক্রিয়াকরণের জন্য আমার ভি-জন্য নির্দেশকে বাধ্য করে।
<script>
export default {
data() {
return {
currentTab: 0,
tab: null,
colorFilter: "",
colors: ["None", "Beige", "Black"],
items: ["Image Gallery", "Favorite Images"]
};
},
methods: {
filteredImages: function() {
return this.$store.getters.getImageDatabase.filter(img => {
if (img.color.match(this.colorFilter)) return true;
});
},
updateGallery: async function() {
// instance is responsive to changes
// change is made and forces filteredImages to do its thing
// async await forces the browser to slow down and allows changes to take effect
await this.$nextTick(function() {
this.colorFilter = "Black";
});
await this.$nextTick(function() {
// Doesnt hurt to zero out filters on change
this.colorFilter = "";
});
}
}
};
</script>
দুঃখিত বন্ধুরা, পৃষ্ঠা পুনরায় লোড পদ্ধতি (ঝাঁকুনি দেওয়া) বাদে, তাদের কেউই আমার পক্ষে কাজ করে না (: কী কাজ করে না)।
এবং আমি এই পদ্ধতিটি পুরানো vue.js ফোরাম থেকে পেয়েছি যা আমার পক্ষে কাজ করে:
https://github.com/vuejs/Discussion/issues/356
<template>
<div v-if="show">
<button @click="rerender">re-render</button>
</div>
</template>
<script>
export default {
data(){
return {show:true}
},
methods:{
rerender(){
this.show = false
this.$nextTick(() => {
this.show = true
console.log('re-render start')
this.$nextTick(() => {
console.log('re-render end')
})
})
}
}
}
</script>