Select2 Tag Box

Source code: Survey setup
Survey.defaultBootstrapCss.navigationButton = "btn btn-primary";
Survey.Survey.cssType = "bootstrap";
Survey.JsonObject.metaData.addProperty("dropdown", {name: "renderAs", default: "standard", choices: ["standard", "select2tagbox"]});
var survey = new Survey.Model({ questions: [
 { type: "dropdown", renderAs: "select2tagbox", choicesByUrl: { url: "https://restcountries.eu/rest/v1/all" }, name: "countries", title: "Please select all countries you have been for the last 3 years."}
 ]});


var widget = {
    name: "select2tagbox",
    isFit : function(question) { return question["renderAs"] === 'select2tagbox'; }
}

Vue.component(widget.name, {
    props: ['question', 'css', 'isEditMode'],
    template: "<select multiple='multiple' style='width: 100%;'></select>",
    mounted: function () {
        var vm = this;
        var widget = $(vm.$el).select2({
            tags: "true",
            theme: "classic"
        });
        vm.question.choicesChangedCallback = function() {
            $(vm.$el).select2({data: vm.question.visibleChoices.map(function(choice) { return { id: choice.value, text: choice.text }; })});
        }
        $(vm.$el).on('select2:unselect', function (e) {
            var index = (vm.question.value || []).indexOf(e.params.data.id);
            if(index !== -1) {
                var val = vm.question.value;
                val.splice(index, 1);
                vm.question.value = val;
            }
        });
        $(vm.$el).on('select2:select', function (e) {
            vm.question.value = (vm.question.value || []).concat(e.params.data.id);
        });
        var updateHandler = function() {
            $(vm.$el).val(vm.question.value).trigger("change");
        }
        vm.question.valueChangedCallback = updateHandler;
        updateHandler();
    }
})
Survey.CustomWidgetCollection.Instance.addCustomWidget(widget);

survey.data = { countries: ["Andorra"] };

new Vue({ el: '#surveyElement', data: { survey: survey } });