Skip to content

Form

Used for data entry and validation, supporting input boxes, radio buttons, checkboxes, file uploads, and other types. Common form layouts are in a cell format, with the form title description on the left and form input on the right.

Among them, Input, Textarea, Picker, Calendar, ColPicker, SelectPicker, Cell, and DatetimePicker have a cell display format and also support prop and rules properties. We call these form item components. Components like InputNumber, Switch, and Upload need to be wrapped in a Cell component for use.

Combined with the wd-form component, rule validation can be implemented for the above components.

For form components, it is recommended to enable the border property on wd-cell-group, so that each cell will have border lines separating them, making the form division clearer.

Basic Usage

In the form, use model to specify the form data object. Each form item component represents a form item, use prop to specify the form item field, and use the rules property to define validation rules.

View Basic Usage Example
html
<wd-form ref="form" :model="model">
  <wd-cell-group border>
    <wd-input
      label="Username"
      label-width="100px"
      prop="value1"
      clearable
      v-model="model.value1"
      placeholder="Please enter username"
      :rules="[{ required: true, message: 'Please enter username' }]"
    />
    <wd-input
      label="Password"
      label-width="100px"
      prop="value2"
      show-password
      clearable
      v-model="model.value2"
      placeholder="Please enter password"
      :rules="[{ required: true, message: 'Please enter password' }]"
    />
  </wd-cell-group>
  <view class="footer">
    <wd-button type="primary" size="large" @click="handleSubmit" block>Submit</wd-button>
  </view>
</wd-form>
typescript
<script lang="ts" setup>
const { success: showSuccess } = useToast()

const model = reactive<{
  value1: string
  value2: string
}>({ 
  value1: '',
  value2: ''
})

const form = ref()

function handleSubmit() {
  form.value
    .validate()
    .then(({ valid, errors }) => {
      if (valid) {
        showSuccess({
          msg: 'Validation passed'
        })
      }
    })
    .catch((error) => {
      console.log(error, 'error')
    })
}
</script>
css
.footer {
  padding: 12px;
}

Validation Error Display Methods

  1. message: Default method, displays text below the input box
  2. toast: Displays error messages as toast popups, only showing the error message of the first form field each time
  3. none: No display of any prompts
Error Display Methods
html
<wd-form ref="form" :model="model" :errorType="errorType">
  <wd-cell-group border>
    <wd-input
      label="Username"
      label-width="100px"
      prop="value1"
      clearable
      v-model="model.value1"
      placeholder="Please enter username"
      :rules="[{ required: true, message: 'Please enter username' }]"
    />
    <wd-input
      label="Password"
      label-width="100px"
      prop="value2"
      show-password
      clearable
      v-model="model.value2"
      placeholder="Please enter password"
      :rules="[{ required: true, message: 'Please enter password' }]"
    />
  </wd-cell-group>
  <view class="footer">
    <wd-button type="primary" size="large" @click="handleSubmit" block>Submit</wd-button>
  </view>
</wd-form>
typescript
<script lang="ts" setup>
const { success: showSuccess } = useToast()
const errorType = ref<string>('message')
const model = reactive<{
  value1: string
  value2: string
}>({ 
  value1: '',
  value2: ''
})

const form = ref()

function handleSubmit() {
  form.value
    .validate()
    .then(({ valid, errors }) => {
      if (valid) {
        showSuccess({
          msg: 'Validation passed'
        })
      }
    })
    .catch((error) => {
      console.log(error, 'error')
    })
}
</script>

Validation Rules

This section demonstrates four types of custom validation and prompt rules: Regular Expression Validation, Function Validation, Function Return Error Message, and Async Function Validation.

View Validation Rules Example
html
<wd-form ref="form2" :model="model">
  <wd-cell-group border>
    <wd-input
      label="Validate"
      label-width="100px"
      prop="value1"
      clearable
      v-model="model.value1"
      placeholder="Regular Expression Validation"
      :rules="[{ required: false, pattern: /\d{6}/, message: 'Please enter 6 digits' }]"
    />
    <wd-input
      label="Validate"
      label-width="100px"
      prop="value2"
      clearable
      v-model="model.value2"
      placeholder="Function Validation"
      :rules="[
              {
                required: false,
                validator: validatorMessage,
                message: 'Please enter correct value'
              }
            ]"
    />
    <wd-input
      label="Validate"
      label-width="100px"
      prop="value3"
      clearable
      v-model="model.value3"
      placeholder="Function Return Error Message"
      :rules="[
              {
                required: false,
                validator: validatorReturnMessage
              }
            ]"
    />
    <wd-input
      label="Validate"
      label-width="100px"
      prop="value4"
      clearable
      v-model="model.value4"
      placeholder="Async Function Validation"
      :rules="[
              {
                required: false,
                validator: validatorAsync,
                message: 'Please enter correct value'
              }
            ]"
    />
  </wd-cell-group>
  <view class="footer">
    <wd-button type="primary" size="large" @click="handleSubmit2" block>Submit</wd-button>
  </view>
</wd-form>
typescript
const form2 = ref()
const model = reactive<{
  value1: string
  value2: string
  value3: string
  value4: string
}>({ 
  value1: '',
  value2: '',
  value3: '',
  value4: ''
})

function validatorMessage(value: string) {
  return value === 'maka'
}

function validatorReturnMessage(value: string) {
  if (value === 'maka') {
    return true
  }
  return 'Please enter maka'
}

function validatorAsync(value: string) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(value === 'maka')
    }, 1000)
  })
}

function handleSubmit2() {
  form2.value
    .validate()
    .then(({ valid, errors }) => {
      if (valid) {
        showSuccess({
          msg: 'Validation passed'
        })
      }
    })
    .catch((error) => {
      console.log(error, 'error')
    })
}
</script>

Form Methods

Method NameDescriptionParametersReturn Value
validateValidate the entire form-Promise
validateFieldValidate a specific form fieldprop: stringPromise
resetFieldsReset form fields to initial values and clear validation results--
clearValidateClear validation informationprops: array / string-

Form Item Methods

Method NameDescriptionParametersReturn Value
resetFieldReset form item field to initial value and clear validation result--
clearValidateClear validation information--

Source Code

Documentation
Component

Released under the MIT License.

Released under the MIT License.