====== Vue.js 3.x LabeledTwoInputsForm コンポーネント ====== ===== 要求 ===== * 2 つのテキスト入力を実装するラベル付きコンポーネント * v-model 対応 * 再利用可能なコンポーネントとする。 * 指定可能な属性が異なるため、$attr をバインドするが、対応できない場合は別のコンポーネントとしてで作成する。 ===== コード ===== import { computed } from 'https://cdnjs.cloudflare.com/ajax/libs/vue/3.0.2/vue.esm-browser.js'; import LabeledForm from '/_export/code/vuejs/vue3/labeled_form?codeblock=0'; import TwoInputsForm from '/_export/code/vuejs/vue3/two_inputs_form?codeblock=0'; const LabeledTwoInputsForm = { template: ` `, components: { labeledForm: LabeledForm, twoInputsForm: TwoInputsForm }, props: { firstValue: { type: String }, secondValue: { type: String }, firstErrors: { type: Array, default: [] }, secondErrors: { 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) { const errorsCombined = computed(() => { return props.firstErrors.concat(props.secondErrors) }) return { errorsCombined } } }; export default LabeledTwoInputsForm; ===== 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: { paddingTop: '7px' } ==== controlWrapperClasses ==== * type: Array * default: [] ==== controlWrapperStyles ==== * type: Object * default: {} ==== controlClasses ==== * type: Array * default: [] ==== controlStyles ==== * type: Object * default: {} ==== messageWrapperClasses ==== * type: Array * default: [] ==== messageWrapperStyles ==== * type: Object * default: {} ==== controlErrorClass ==== * type: String * default: 'has-error' ==== messageErrorClass ==== * type: String * default: 'text-danger' ==== formErrorClass ==== * type: String * default: 'has-error' ==== labelErrorClass ==== * type: String * default: 'text-danger' ===== Events ===== ===== Demo ===== ==== テーブルライクなレイアウト ====