В то время как, практикуя различные элементы, используя Vue
, я застрял в этой точке. Когда я попытался создать компонент template
option
и попытался использовать его в select
, он не работает.
Vue.component('todo-item', {
props: ['todo'],
template: '<option v-bind:value="todo.id">{{todo.text}}</option>'
})
var app = new Vue({
el: '#app',
todo : [],
data: {
message: 'Hello Vue!123',
buttonText: 'Click Me',
seen:true,
groceryList: [
{ id: 0, text: 'Vegetables' },
{ id: 1, text: 'Cheese' },
{ id: 2, text: 'Whatever else humans are supposed to eat' }
]
},
methods:{
buttonClick:() => {
app.message="Button Clicked";
app.seen=true;
}
}
})
table{
width:50%;
border: solid 2px;
}
td{
border: solid 1px;
text-align:center
}
ol{
list-style-type : none;
}
select{
width:30%
}
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id ="app">
<p v-if="seen">{{message}}</p>
<button v-on:click="buttonClick">
{{buttonText}}
</button>
<br><br>
<input v-model="message"></input>
<br>
<br>
<select>
<todo-item v-for="grocery in groceryList" :todo="grocery">
</select>
<todo-item v-for="grocery in groceryList" :todo="grocery">
</todo-item>
<ul v-for="grocery in groceryList">
<li>
{{ grocery.text }}
</li>
</ul>
</div>
Я пытался использовать его вне тега select
а также любой другой html
работающий нормально, как input
.
Дайте мне знать в разделе комментариев, если что-нибудь, что вы хотите, чтобы я сделал, чтобы объяснить мою проблему. Спасибо
Я думаю, что пошло не так, это не Vue или Javascript. Это как браузер обрабатывает недействительный HTML.
select
должен содержать только option
.
если вы делаете это в HTML (при условии, что Javascript не используется вообще)
<select>
<todo-item></todo-item>
<todo-item></todo-item>
<todo-item></todo-item>
</select>
браузер удалит todo-item
поскольку он недействителен. https://codepen.io/jacobgoh101/pen/pZZQRz
В вашем случае, к моменту инициализации Vue, браузер уже удалил недействительный HTML-код, который был для todo-item
.
Вы можете избежать этого, поместив select
в компонент, а также. demo: https://codepen.io/jacobgoh101/pen/WKKYGm
Vue.component('basic-select', {
template:'
<select>
<slot></slot>
</select>
'
});
и использовать его как
<basic-select>
<todo-item v-for="(grocery,i) in groceryList" :key="i" :todo="grocery">
</basic-select>
Таким образом, функция Vue будет применяться без использования браузера.
Такая проблема возникает только при использовании Vue непосредственно в браузере без использования инструментов сборки и vue-loader. В типичном проекте, создаваемом vue-cli, весь html-шаблон является дескриптором внутри одного компонента Vue, и весь html будет скомпилирован Vue перед использованием браузером
Если вы хотите использовать тег select
вам нужно использовать теги option
внутри него.
В документе vue:
<select v-model="selected">
<!-- inline object literal -->
<option v-bind:value="{ number: 123 }">123</option>
</select>
В вашем примере вы можете использовать его так:
<select v-model="selectedGrocery">
<option v-bind:value="grocery.id" v-for="grocery in groceryList">
{{grocery.text}}
</option>
</select>