JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script src="https://unpkg.com/[email protected]"></script>
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/vue-multiselect.min.css">
<div id="vueapp">
<label class="typo__label">選擇核心技能</label>
<multiselect v-model="selectedObjects" tag-placeholder="Add this as new tag" placeholder="Search or add a tag" label="tag_name" track-by="tag_id" :options="options" :multiple="true" :taggable="true"
@remove="removeSelectedSkill">
</multiselect>
<label class="typo__label">技能測試標籤</label>
<div>
<fieldset>
<span v-for="option in selectedObjects">
<label v-for="skill in option.skills">
<input type="checkbox" v-bind:value="skill.id" v-model="postdata" />
<span>{{skill.skill_name}}</span>  
</label>
</span>
</fieldset>
{{postdata}}
</div>
</div>
JavaScript
Vue.component('multiselect', window.VueMultiselect.default)
// 接進來的api
const optionsFromWeb = [
{
"tag_id": 1, "tag_name": "Domain Service",
"skills": [{ "id": 1, "skill_name": "Windows AD" }, { "id": 2, "skill_name": "LDAP" }]
},{
"tag_id": 2, "tag_name": "EMail service","skills": [{ "id": 3, "skill_name": "SMTP" }, { "id": 4, "skill_name": "ExCHANGE ONLINE" }]
},{
"tag_id": 5, "tag_name": "Web Proxy",
"skills": [{ "id": 5, "skill_name": "EMail Gateway" }, { "id": 6, "skill_name": "Microsoft Exchange" }]
}]
var app = new Vue({
el: '#vueapp',
components: { Multiselect: window.VueMultiselect.default },
data() {
return {
selectedObjects:[],
options: [],
offersData: [],//技能box
postdata: []
}
},
created(){
// 這裡換成你要怎麼接api
this.options = optionsFromWeb
},
methods:{
// 當移除核心技能時,順便移除已選擇的技能測試的選項
removeSelectedSkill(removedOption){
const removedSkills = removedOption.skills.map((s)=> s.id)
this.postdata = this.postdata.filter(item => !removedSkills.includes(item))
}
}
})