vuejs:vue3:labeled_input_form

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

  • input の以下のタイプを実装するラベル付きコンポーネント
    • text
    • password
    • email
    • url
    • number
    • date
    • time
  • v-model 対応
  • 再利用可能なコンポーネントとする。
  • 指定可能な属性が異なるため、$attr をバインドするが、対応できない場合は別のコンポーネントとしてで作成する。
LabeledInputForm.js
import LabeledForm from '/_export/code/vuejs/vue3/labeled_form?codeblock=0';
import InputForm   from '/_export/code/vuejs/vue3/input_form?codeblock=0';
 
const LabeledInputForm = {
  template: `
    <labeled-form
      :errors="errors"
      :label-text="labelText"
      :form-wrapper-classes="formWrapperClasses"
      :form-wrapper-styles="formWrapperStyles"
      :label-wrapper-classes="labelWrapperClasses"
      :label-wrapper-styles="labelWrapperStyles"
      :form-error-class="formErrorClass"
      :label-error-class="labelErrorClass"
    >
      <template #label v-if="!labelText">
        <slot name="label">
        </slot>
      </template>
      <input-form
        :type="type"
        v-bind="$attrs"
        :value="value"
        @update:value="updateValue"
        :errors="errors"
        :control-wrapper-classes="controlWrapperClasses"
        :control-wrapper-styles="controlWrapperStyles"
        :control-classes="controlClasses"
        :control-styles="controlStyles"
        :control-error-class="controlErrorClass"
        :message-wrapper-classes="messageWrapperClasses"
        :message-wrapper-styles="messageWrapperStyles"
        :message-error-class="messageErrorClass"
      >
      </input-form>
    </labeled-form>
  `,
  components: {
    labeledForm: LabeledForm,
    inputForm: InputForm
  },
  props: {
    type:                  { type: String, default: 'text' },
    value:                 { type: String },
    errors:                { type: Array,  default: [] },
    labelText:             { type: String },
    formWrapperClasses:    { type: Array,  default: [] },
    formWrapperStyles:     { type: Object, default: {} },
    labelWrapperClasses:   { type: Array,  default: [] },
    labelWrapperStyles:    { type: Object, default: {} },
    controlWrapperClasses: { type: Array,  default: [] },
    controlWrapperStyles:  { type: Object, default: {} },
    controlClasses:        { type: Array,  default: [] },
    controlStyles:         { type: Object, default: {} },
    messageWrapperClasses: { type: Array,  default: [] },
    messageWrapperStyles:  { type: Object, default: {} },
    formErrorClass:        { type: String, default: 'has-error' },
    labelErrorClass:       { type: String, default: 'text-danger' },
    controlErrorClass:     { type: String, default: 'is-invalid' },
    messageErrorClass:     { type: String, default: 'text-danger' },
  },
  setup(props, context) {
    function updateValue(v) {
      context.emit('update:value', v)
    }
    return { updateValue }
  }
};
export default LabeledInputForm;
  • type: String
  • default: 'text
  • type: String
  • type: Array
  • default: []
  • type: String
  • type: Array
  • default: []
  • type: Object
  • default: {}
  • type: Array
  • default: []
  • type: Object
  • default: { paddingTop: '7px' }
  • type: Array
  • default: []
  • type: Object
  • default: {}
  • type: Array
  • default: []
  • type: Object
  • default: {}
  • type: Array
  • default: []
  • type: Object
  • default: {}
  • type: String
  • default: 'has-error'
  • type: String
  • default: 'text-danger'
  • type: String
  • default: 'has-error'
  • type: String
  • default: 'text-danger'

<html>
<link rel=“stylesheet” href=“/_export/code/vuejs/vue3/form_styles?codeblock=0”>

<labeled-input-form type="text"
  v-model:value="testText"
  :errors="[]"
  :form-wrapper-classes="['table-form-wrapper']"
  :label-wrapper-classes="['col-sm-4', 'table-label-wrapper']"
  :control-wrapper-classes="['col-sm-8', 'table-control-wrapper']"
>
  <template #label>
    <span class="label label-info">Test</span> <label>Test Label</label>
  </template>
</labeled-input-form>
<labeled-input-form type="date"
  v-model:value="testText"
  :errors="errors"
  label-text="Test Label from props"
  :form-wrapper-classes="['table-form-wrapper']"
  :label-wrapper-classes="['col-sm-4', 'table-label-wrapper']"
  :control-wrapper-classes="['col-sm-8', 'table-control-wrapper']"
>
</labeled-input-form>
<labeled-input-form type="time"
  v-model:value="testText"
  :errors="errors"
  label-text="Test Label from props"
  :form-wrapper-classes="['table-form-wrapper', 'mb-5']"
  :label-wrapper-classes="['col-sm-4', 'table-label-wrapper']"
  :control-wrapper-classes="['col-sm-8', 'table-control-wrapper']"
>
</labeled-input-form>

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

const App2 = {

components: {
  labeledInputForm: LabeledInputForm
},
data() {
  return {
    testText: 'ABC',
    errors: ['error message A', 'error message B']
  }
}

}

createApp(App2).mount('#app2')
</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/labeled_input_form.txt
  • 最終更新: 2021/01/26 00:48
  • by admin