ارتباط بین کامپوننتها در Vue.js - قسمت سوم استفاده از تزریق وابستگیها
نویسنده: کامیاری
تاریخ: ۱۳۹۸/۰۳/۲۸ ۱۳:۴۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
روش جاری شباهت زیادی به استفاده از Context در React دارد:
Context provides a way to pass data through the component tree without having to pass props down manually at every level
// parent component providing 'foo'
var Provider = {
provide: {
foo: 'bar'
},
// ...
} // child component injecting 'foo'
var Child = {
inject: ['foo'],
created () {
console.log(this.foo) // => "bar"
}
// ...
} Using an injected value as the default for a prop
//دریافت میکنیم props در قسمت child را در کامپوننت foo مقدار
const Child = {
inject: ['foo'],
props: {
bar: {
default () {
return this.foo
}
}
}
}
Using an injected value as data entry
//دریافت میکنیم data در قسمت child را در کامپوننت foo مقدار
const Child = {
inject: ['foo'],
data () {
return {
bar: this.foo
}
}
} <!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<title>Dependency injection</title>
</head>
<body>
<div id="app">
<button @click="counter++">Increment counter</button>
<h2>Parent</h2>
<p>{{counter}}</p>
<div>
<h3>Child</h3>
<child></child>
</div>
</div>
<script>
const Child = {
inject: ['counter_in_child'],
template: `<div>Counter Child is:{{ counter_in_child }}</div>`
};
new Vue ({
el: "#app",
components: { Child },
provide() {
return {
counter_in_child: this.counter
};
},
data() {
return {
counter: 0
};
}
});
</script>
</body>
</html> <!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<title>Dependency injection</title>
</head>
<body>
<div id="app">
<button @click="counter++">Increment counter</button>
<h2>Parent</h2>
<p>{{counter}}</p>
<div>
<h3>Child</h3>
<child></child>
</div>
</div>
<script>
const Child = {
inject: ['counter_in_child'],
template: `<div>Counter Child is:{{ counter_in_child.counter }}</div>`
};
new Vue ({
el: "#app",
components: { Child },
provide() {
const counter_in_child={};
Object.defineProperty(counter_in_child,'counter',{
enumerable:true,
get:()=>this.counter
})
return {
counter_in_child
};
},
data() {
return {
counter: 0
};
}
});
</script>
</body>
</html> provide and inject are primarily provided for advanced plugin / component library use cases. It is NOT recommended to use them in generic application code