vuejs:vue3:checkbox_form

Vue.js 3.x CheckboxForm コンポーネント

  • checkbox タグのエラーメッセージ表示付きコンポーネント
  • 複数の選択候補から選択する複数チェックボックスとして機能させたい
  • 単一フィールドの Boolean 値切り替え用途は SwitchForm を参照
CheckboxForm.js
import { computed } from 'https://cdnjs.cloudflare.com/ajax/libs/vue/3.0.2/vue.esm-browser.js';
import { getWrapClass, generalizeOptions } from 'https://wws.jp/_export/code/vuejs/vue3/form_utils?codeblock=0';
 
const CheckboxForm = {
  template: `
    <div :class="computedControlWrapperClasses" :style="controlWrapperStyles">
      <label v-for="(opt, idx) in computedOptions"
        :class="optionClasses"
        :style="optionStyles"
      >
        <input type="checkbox"
          :class="controlClasses"
          :style="controlStyles"
          :checked="isChecked(opt.value)"
          @change="onChange(opt.value)"
        >
        {{ opt.title }}
      </label>
      <div :class="computedMessageWrapperClasses" :style="messageWrapperStyles">
        <template v-for="msg in errors">
          <span>{{ msg }}</span><br>
        </template>
      </div>
    </div>
  `,
  props: {
    value:                 { type: Array },
    options:               { type: Array,  default: [] },
    errors:                { type: Array,  default: [] },
    controlWrapperClasses: { type: Array,  default: [] },
    controlWrapperStyles:  { type: Object, default: {} },
    controlClasses:        { type: Array,  default: [] },
    controlStyles:         { type: Object, default: {} },
    optionClasses:         { type: Array,  default: ['checkbox-inline'] },
    optionStyles:          { type: Object, default: {} },
    messageWrapperClasses: { type: Array,  default: [] },
    messageWrapperStyles:  { type: Object, default: {} },
    controlErrorClass:     { type: String, default: 'has-error' },
    messageErrorClass:     { type: String, default: 'text-danger' },
  },
 
  setup(props, context) {
    const computedControlWrapperClasses = computed(() => {
      return getWrapClass(
        props.errors,
        props.controlWrapperClasses,
        props.controlErrorClass
      )
    })
 
    const computedMessageWrapperClasses = computed(() => {
      return getWrapClass(
        props.errors,
        props.messageWrapperClasses,
        props.messageErrorClass
      )
    })
 
    const computedOptions = computed(() => {
      return generalizeOptions(props.options)
    })
 
    function onChange(v) {
      const idx = props.value.indexOf(v)
      if (idx >= 0) {
        props.value.splice(idx, 1)
      } else {
        props.value.splice(0, 0, v)
      }
      context.emit('update:value', props.value)
    }
 
    function isChecked(v) {
      return (props.value.indexOf(v) >= 0) ? true : false
    }
 
    return {
      computedControlWrapperClasses,
      computedMessageWrapperClasses,
      computedOptions,
      isChecked,
      onChange
    }
  }
};
export default CheckboxForm;

<html><style>th, td { padding: 12px !important }</style></html>

Property Type Default Description
options Array [] select タグの選択肢 option を指定
{ title: 表示名, value: 値 } 形式のオブジェクトを要素とする配列
または、要素に “title” プロパティが存在しない場合、単に値の配列として { title: 値, value: 値 } の配列に自動的に変換される
value String v-model プロパティとして value を持つ
controlWrapperClasses Array [] select を囲う div タグに反映するクラス
controlWrapperStyles Object {} select を囲う div タグに反映するスタイル
controlClasses Array [] 入力コントロールに反映するクラス
controlStyles Object {} 入力コントロールに反映するスタイル
optionClasses Array [] 選択肢テキストに反映するクラス
optionStyles Object {} 選択肢テキストに反映するスタイル
messageWrapperClasses Array [] エラーメッセージを囲う div タグに反映するクラス
errors Array [] エラーメッセージの配列
controlErrorClass String 'has-error' コントロールに反映するエラークラス
messageErrorClass String 'text-danger' エラーメッセージに反映するエラークラス

<html><style>th, td { padding: 12px !important }</style></html>

Event Value
update:value 選択された値

<html>

<h3>コンポーネント実装</h3>
<checkbox-form
  :options="options"
  :control-wrapper-classes="['checkbox', 'col-sm-12']"
  :errors="errors"
  v-model:value="boundValue"
>
</checkbox-form>
<br>
<h3>データバインディング確認用フォーム</h3>
<checkbox-form
  :options="options"
  :control-wrapper-classes="['checkbox', 'col-sm-12']"
  :errors="errors"
  v-model:value="boundValue"
  :option-classes="['checkbox']"
>
</checkbox-form>
<button @click="clearError">ClearError</button>
<button @click="appendError">AppendError</button>
<button @click="showValue">ShowValue</button>

<script type=“module”>
import { createApp } from 'https://cdnjs.cloudflare.com/ajax/libs/vue/3.0.2/vue.esm-browser.js';
import CheckboxForm from '/_export/code/vuejs/vue3/checkbox_form?codeblock=0';

const App = {

components: {
  checkboxForm: CheckboxForm
},
data() {
  return {
    boundValue: ['AAA'],

// options: ['ABC', 'XYZ', 'AAA'],

    options: [
      {title: 'ABCタイトル', value: 'ABC'},
      {title: 'XYZタイトル', value: 'XYZ'},
      {title: 'AAAタイトル', value: 'AAA'}
    ],
    errors: []
  }
},
methods: {
  clearError() {
    this.errors.splice(0, 1);
  },
  appendError() {
    this.errors.splice(0, 0, 'error message B')
  },
  showValue() {
    console.log(this.boundValue)
  }
}

}

createApp(App).mount('#app')
</script>
</html>

<html><style>
h2.page-header {

font-weight: 600;
font-size: 2.4rem;
position: relative;
padding: 10px 0 10px 16px;
margin-top: 3rem !important;
margin-bottom: 2rem !important;

}
h2:before {

  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 6px;
  height: 100%;
  background: #ccc;

}
div#disqus__thread {

width: 100% !important;

}
</style></html>

  • vuejs/vue3/checkbox_form.txt
  • 最終更新: 2024/12/18 02:32
  • by 127.0.0.1