Извините, но не понятно, что вы хотите - где находится поставщик для "инъекции"? Почему вы используете inject в том же компоненте, что и само значение?
Вот ваш код без inject :
1. Используйте атрибут data
const Component = {
data() {
return {
state: {
example: 1
}
}
},
template: `<div>
<div>{{ state }}</div>
<button @click="click">click</button>
</div>`,
methods: {
click() {
this.state.example += 1
console.log(this.state)
}
}
}
new Vue({
el: "#app",
components: {
Component
},
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<component></component>
</div>
Просто используйте атрибут data - вы можете использовать значение по умолчанию для example
.
2. Использование inject ion
inject - это нечто совершенно другое - это способ передачи значений от поставщика к потребителю :
const Component = {
inject: ['state1'],
data() {
return {
state: {
example: 1
}
}
},
template: `<div>
<div>injected: {{ state1 }}</div>
<div>{{ state }}</div>
<button @click="click">click</button>
</div>`,
methods: {
click() {
this.state.example += 1
console.log(this.state)
}
}
}
new Vue({
el: "#app",
provide: {
state1: {
example1: 1
}
},
components: {
Component
},
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<component></component>
</div>
Вы можете "пропустить" уровни компонентов и использовать значение при условии в компонентах, куда вы вводите it - Вам не нужно проходить все это вниз как реквизит .
3. Создайте реактивный inect ion
Если вы хотите сделать реактивный инъекцию , вам нужно передать что-то более сложное:
const Component1 = {
inject: ['state2'],
data() {
return {
state: {
example: 1
}
}
},
template: `<div>
<div>injected: {{ state2.state2P }}</div>
<div>{{ state }}</div>
<button @click="click">click</button>
</div>`,
methods: {
click() {
this.state.example += 1
console.log(this.state)
}
}
}
new Vue({
el: "#app",
data() {
return {
state2: {
example2: 1
}
}
},
provide() {
// create an object (state2)
const state2 = {}
// define a property on the object (state2P), that
// has a get() function that always gets the provider's
// value you want to inject
Object.defineProperty(state2, 'state2P', {
enumerable: true,
get: () => this.state2,
})
// return the created object (with a property that always
// gets the value in the parent)
return {
state2
}
},
components: {
Component1
},
methods: {
parentClick() {
this.state2.example2 += 1
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<component1></component1>
<button @click="parentClick">PARENT CLICK</button>
</div>
Я добавил кнопку в шаблон, чтобы вы могли видеть, что method
, определенный в области компонента поставщика, изменяет значение, отображаемое в области компонента потребителя. , (Также пришлось изменить имя компонента, так как Vue начал «скулить» об использовании ограниченного слова.)