123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- <template>
- <div class="double-picker">
- <div class="picker-column">
- {{ column1Label }}
- <select class="custom-select"
- :id="'picker-' + column1Name"
- v-model="selectedColumn1"
- @change="updateColumn2"
- >
-
- <option
- v-for="item in column1Data"
- :key="item.value"
- :value="item.value"
- >
- {{ item.label }}
- </option>
- </select>
- </div>
- <div class="picker-column">
- {{ column2Label }}
- <select class="custom-select"
- :id="'picker-' + column2Name"
- v-model="selectedColumn2"
- >
- <option
- v-for="item in column2Data"
- :key="item.value"
- :value="item.value"
- >
- {{ item.label }}
- </option>
- </select>
- </div>
- </div>
- </template>
- <script>
- export default {
- props: {
- column1Label: {
- type: String,
- default: "第一列"
- },
- column2Label: {
- type: String,
- default: "第二列"
- },
- column1Data: {
- type: Array,
- required: true
- },
- column2Data: {
- type: Array,
- required: true
- },
- column1Name: {
- type: String,
- default: "column1"
- },
- column2Name: {
- type: String,
- default: "column2"
- }
- },
- data() {
- return {
- selectedColumn1: "",
- selectedColumn2: ""
- };
- },
- methods: {
- updateColumn2() {
- this.$emit("update:column2Data", this.getColumn2Data());
- this.selectedColumn2 = "";
- },
- getColumn2Data() {
-
- const selectedColumn1 = this.column1Data.find(
- item => item.value === this.selectedColumn1
- );
- return selectedColumn1 ? selectedColumn1.children || [] : [];
- }
- },
- watch: {
- selectedColumn1() {
- this.$emit("input", {
- column1: this.selectedColumn1,
- column2: this.selectedColumn2
- });
- },
- selectedColumn2() {
- this.$emit("input", {
- column1: this.selectedColumn1,
- column2: this.selectedColumn2
- });
- }
- }
- };
- </script>
- <style scoped>
- .select-container {
- display: flex;
- width: 200px;
- }
-
- .custom-select {
- appearance: none;
- -webkit-appearance: none;
- -moz-appearance: none;
- background-color: transparent;
- border: none;
- outline: none;
- padding: 8px 12px;
- font-size: 16px;
- width: 100%;
- cursor: pointer;
- color: #333;
- }
-
-
- .select-container::after {
- content: "▾";
- position: absolute;
- right: 10px;
- top: 50%;
- transform: translateY(-50%);
- pointer-events: none;
- color: #999;
- }
-
- .double-picker {
- display: flex;
- justify-content: space-between;
- }
- .picker-column {
- flex: 1;
- }
- label {
- display: block;
- margin-bottom: 5px;
- }
- select {
- width: 100%;
- padding: 5px;
- font-size: 14px;
- }
- </style>
|