nly-adminlte-vue
Version:
nly adminlte3 components
546 lines (450 loc) • 15.6 kB
Markdown
# Form Radio Inputs
> `<nly-form-radio-group>` 和 `<nly-form-radio>` 组件是单选框组件
## 单个单选框
```html
<template>
<div>
<nly-form-group label="单个单选框">
<nly-form-radio v-model="selected" name="some-radios" value="A"
>Option A</nly-form-radio
>
<nly-form-radio v-model="selected" name="some-radios" value="B"
>Option B</nly-form-radio
>
</nly-form-group>
<div class="mt-3">Selected: <strong>{{ selected }}</strong></div>
</div>
</template>
<script>
export default {
data() {
return {
selected: ""
};
}
};
</script>
<!-- 单选框组件.name -->
<!-- nly-form-radio.vue -->
```
## 单选框组
`<nly-form-radio-group>` 可以设置 `options` prop 或者嵌入 `<nly-form-radio>` 组件来渲染成单选框组
使用 `<nly-form-radio>` 嵌入 `<nly-form-radio-group>` 组件时,`<nly-form-radio>` 会继承 `<nly-form-radio-group>` 的大部分 prop
v-model 也会绑定在 `<nly-form-radio-group>`上
```html
<template>
<div>
<nly-form-group label="options 单选框组">
<nly-form-radio-group
id="radio-group-1"
v-model="selected"
:options="options"
name="radio-options"
></nly-form-radio-group>
</nly-form-group>
<nly-form-group label="子组件单选框组">
<nly-form-radio-group
id="radio-group-2"
v-model="selected"
name="radio-sub-component"
>
<nly-form-radio value="first">切换</nly-form-radio>
<nly-form-radio value="second">切换</nly-form-radio>
<nly-form-radio value="third" disabled>切换</nly-form-radio>
<nly-form-radio :value="{ fourth: 4 }">切换</nly-form-radio>
</nly-form-radio-group>
</nly-form-group>
<div class="mt-3">Selected: <strong>{{ selected }}</strong></div>
</div>
</template>
<script>
export default {
data() {
return {
selected: "first",
options: [
{ text: "切换为第一个", value: "first" },
{ text: "切换为第二个", value: "second" },
{ text: "切换为第三个", value: "third", disabled: true },
{ text: "切换为第四个", value: { fourth: 4 } }
]
};
}
};
</script>
<!-- 单选框组.name -->
<!-- nly-form-radio-group.vue -->
```
支持混合使用 `options` prop 和 `<nly-form-radio>` 嵌套到 `<nly-form-radio-group>` 中,但是 `<nly-form-radio>`
组件会默认渲染到 `options` prop 渲染的选项下面,如果需要使 `<nly-form-radio` 渲染到 `options` prop 上面,请使用插槽 `first`
```html
<template>
<div>
<nly-form-group label="使用插槽">
<nly-form-radio-group
id="radio-slots"
v-model="selected"
:options="options"
name="radio-options-slots"
>
<template #first>
<nly-form-radio value="first">切换</nly-form-radio>
</template>
<nly-form-radio :value="{ fourth: 4 }">这是第四个</nly-form-radio>
<nly-form-radio value="fifth">这是第五个</nly-form-radio>
</nly-form-radio-group>
</nly-form-group>
<div class="mt-3">Selected: <strong>{{ selected }}</strong></div>
</div>
</template>
<script>
export default {
data() {
return {
selected: "",
options: [
{ text: "切换为第二个", value: "second" },
{ text: "切换为第三个", value: "third" }
]
};
}
};
</script>
<!-- first 插槽.name -->
<!-- nly-form-radio-group-slot.vue -->
```
## 数组类型 options
`options` 是一个数组,元素可以是字符串或者 `key-value` 对象,每一个元素可以有以下 key:
- **`value`** 选项值, 如果选中,会添加到 `v-model` 绑定的值中
- **`disabled`** 禁用当前选择,无法选中
- **`text`** 选项显示的文本
- **`html`** 选项显示的文本,是 html 字符串
`value` 类型可以是字符串,数字,简单对象. 请避免同一个 options 中不同元素的 `value` 类型不同.
如果 `text` 和 `html` 属性同时出现, `html` 属性会覆盖 `text`,即 `html` 属性的渲染的优先级比 `text` 高。 `html` 属性仅
支持原生的 html 字符串,如果嵌入组件,是不生效的。注意并非所有的浏览器都会支持所有的 html 字符串。
<div class="alert alert-warning">
<p class="mb-0 small">
<strong>注意:</strong> 使用 (<code class="notranslate" translate="no"
>html</code
>) 字符串的属性可能会引起
<nly-link
href="https://en.wikipedia.org/wiki/Cross-site_scripting"
class="alert-link"
target="_blank"
>
脚本攻击 (XSS),
</nly-link>
当用户使用这类属性的时候,您应该谨慎
<nly-link
href="https://en.wikipedia.org/wiki/HTML_sanitization"
class="alert-link"
target="_blank"
>
处理
</nly-link>
这类值
</p>
</div>
```js
const options = [
"A",
"B",
"C",
{ text: "D", value: { d: 1 }, disabled: true },
"E",
"F"
];
```
如果数组的元素全是字符串, 这个字符串默认会被转为 `text` 和 `value`
支持在 `options` 中使用字符串和对象混合类型, 详情请查看[对象数组 options](#对象数组)
在 NlyAdminlteVue 中, 会自动把上面的 options 转化为 [对象数组 options](#对象数组) 格式:
```js
const options = [
{ text: "A", value: "A", disabled: false },
{ text: "B", value: "B", disabled: false },
{ text: "C", value: "C", disabled: false },
{ text: "D", value: { d: 1 }, disabled: true },
{ text: "E", value: "E", disabled: false },
{ text: "F", value: "F", disabled: false }
];
```
### 对象数组
```js
const options = [
{ text: "Item 1", value: "first" },
{ text: "Item 2", value: "second" },
{ html: "<b>Item</b> 3", value: "third", disabled: true },
{ text: "Item 4" },
{ text: "Item 5", value: { foo: "bar", baz: true } }
];
```
如果没有在数组的对象元素中定义 `value` 属性,`text` 属性既会渲染成 `text`, 又会渲染成 `value` 属性。
如果使用的是 `html` 属性, 那必须提供一个 `value` 属性, 否则会报错
在 NlyAdminlteVue 中, 会自动把上面的 options 转化为对象数组 options 格式:
```js
const options = [
{ text: "Item 1", value: "first", disabled: false },
{ text: "Item 2", value: "second", disabled: false },
{ html: "<b>Item</b> 3", value: "third", disabled: true },
{ text: "Item 4", value: "Item 4", disabled: false },
{ text: "Item 5", value: "E", disabled: false }
];
```
### 自定义 options 的属性名称
如果您想用自定义的属性来代替 `text`, `value` 属性。比如使用 `name` 来代替 `text`,
可以通过 `text-field`, `html-field`, `value-field`, 和 `disabled-field` prop 来指定自定义的属性
```html
<template>
<div>
<nly-form-radio-group
v-model="selected"
:options="options"
class="mb-3"
value-field="item"
text-field="name"
disabled-field="notEnabled"
></nly-form-radio-group>
<div class="mt-3">Selected: <strong>{{ selected }}</strong></div>
</div>
</template>
<script>
export default {
data() {
return {
selected: "A",
options: [
{ item: "A", name: "Option A" },
{ item: "B", name: "Option B" },
{ item: "D", name: "Option C", notEnabled: true },
{ item: { d: 1 }, name: "Option D" }
]
};
}
};
</script>
<!-- 自定义对象数组属性.name -->
<!-- nly-form-radio-group-options-fields.vue -->
```
## 单选框的值 value 和 v-model
`<nly-form-radio>` 组件没有默认值. 你必须给 `<nly-form-radio>` 的 prop `value` 传入一个人初始值 . 绑定到 `v-model` 值会直接渲染成选中状态
`<nly-form-radio>` 和 `<nly-form-radio-group>` `v-model` 都绑定到了 `checked` prop. 你逆序事给 `v-model` 绑定一个 `options` 中可选的值或者
`<nly-form-radio>` 中组件中的 `value`, 不要直接使用 `checked`
每个单选框都必须有一个唯一的值
单选框的 `value` props 支持 `string`, `boolean`, `number`, `object` 等类型
## 水平模式和堆叠模式
`<nly-form-radio-group>` 组件默认是渲染成水平模式, while `<nly-form-radio>` 默认是渲染成块级堆叠模式
可以设置 `<nly-form-radio-group>` 的 prop `stacked` 使其渲染成堆叠式样
如果 `<nly-form-radio>` 不是嵌套在 `<nly-form-radio-group>` 中, 可以设置 `nly-form-radio` 的 `inline` 使其渲染成水平模式
```html
<template>
<div>
<nly-form-group label="水平模式">
<nly-form-radio-group
v-model="selected"
:options="options"
name="radio-inline"
></nly-form-radio-group>
</nly-form-group>
<nly-form-group label="堆叠模式">
<nly-form-radio-group
v-model="selected"
:options="options"
name="radios-stacked"
stacked
></nly-form-radio-group>
</nly-form-group>
<div class="mt-3">Selected: <strong>{{ selected }}</strong></div>
</div>
</template>
<script>
export default {
data() {
return {
selected: "yide",
options: [
{ text: "张飞", value: "yide" },
{ text: "诸葛亮", value: "kongming" },
{ text: "关羽", value: "yunchang" }
]
};
}
};
</script>
<!-- 水平和 堆叠.name -->
<!-- nly-form-radio-stacked.vue -->
```
## 控制代销
使用 `size` prop 来控制大小,默认大小为 `md`, 可选 `sm` (small) and `lg` (large).
```html
<div>
<nly-form-radio name="radio-size" size="sm">Small</nly-form-radio>
<nly-form-radio name="radio-size">Default</nly-form-radio>
<nly-form-radio name="radio-size" size="lg">Large</nly-form-radio>
</div>
<!-- 大小.name -->
<!-- form-radio-sizes.vue -->
```
如果需要控制 `<nly-form-radio>` 组件的大小,可以设置 `size`, 也可以设置 `<nly-form-radio-group>` 的 `size` prop
通常情况下, 如果不单独设置 `<nly-form-radio>` 组件的大小, `<nly-form-radio>` 组件会继承 `<nly-form-radio>` 的大小
**注意:** 控制 check 的大小在 `adminlte3` 中是不支持的, 这是 `NlyAdminlteVue` 自定义的 css 式样
## 按钮模式
支持设置 `<nly-form-radio>` 渲染成按钮式样
按钮模式下的 radio 在选中的时候会渲染一个 `.active` css 类型
```html
<template>
<div>
<nly-form-group label="按钮模式">
<nly-form-radio-group
id="btn-radios-1"
v-model="selected"
:options="options"
buttons
name="radios-btn-default"
></nly-form-radio-group>
</nly-form-group>
<nly-form-group label="按钮模式">
<nly-form-radio-group
id="btn-radios-2"
v-model="selected"
:options="options"
buttons
button-variant="outline-primary"
size="lg"
name="radio-btn-outline"
></nly-form-radio-group>
</nly-form-group>
<nly-form-group label="堆叠按钮模式">
<nly-form-radio-group
id="btn-radios-3"
v-model="selected"
:options="options"
buttons
stacked
name="radio-btn-stacked"
></nly-form-radio-group>
</nly-form-group>
</div>
</template>
<script>
export default {
data() {
return {
selected: "radio1",
options: [
{ text: "Radio 1", value: "radio1" },
{ text: "Radio 3", value: "radio2" },
{ text: "Radio 3 (disabled)", value: "radio3", disabled: true },
{ text: "Radio 4", value: "radio4" }
]
};
}
};
</script>
<!-- 按钮模式.name -->
<!-- nly-form-radio-buttons.vue -->
```
## 原生单选框
设置 `plain` prop 可以使 `<nly-form-radio>` and `<nly-form-radio-group>` 渲染成一个原生单选框
```html
<template>
<div>
<nly-form-group label="水平原生单选框">
<nly-form-radio-group
v-model="selected"
:options="options"
plain
name="plain-inline"
></nly-form-radio-group>
</nly-form-group>
<nly-form-group label="堆叠原生单选框">
<nly-form-radio-group
v-model="selected"
:options="options"
plain
stacked
name="plain-stacked"
></nly-form-radio-group>
</nly-form-group>
</div>
</template>
<script>
export default {
data() {
return {
selected: "first",
options: [
{ text: "First radio", value: "first" },
{ text: "Second radio", value: "second" },
{ text: "Third radio", value: "third" }
]
};
}
};
</script>
<!-- 原生单选框.name -->
<!-- nly-form-radio-plain.vue -->
```
**Note:** 原生 单选框 的 prop `button` 和 `buttons` is 无效
## 表单必填 valid 状态
如果使用单选 `<nly-form-radio>`组件 , 且需要在 `nly-form` 组件中必填 , 你必须传入 `name` prop 和 `required` 给每个
`<nly-form-radio>` 组件,这样 `nly-form` 的必填才会生效. 所有的绑定到同一个 `v-model` 值 的 `<nly-form-radio>`
组件必须设置相同的 `name` prop
对于辅助技术来说, prop `name` 是必传的, 这样辅助技术才能识别 radio 属于哪个表单。 prop `required` 只有在设置了 prop `name` 才生效.
如果 `<nly-form-radio-group>` 组件没有传入 prop `name`, 会自动生成一个唯一的 `name`
## 自动聚焦
`<nly-form-checkbox>` 组件设置 `autofocus` prop 时, 会自动聚焦到当前选择框。 如果组件或者页面
被 `<keep-alive>` 缓存了,返回这个页面或者组件时,也会自动聚焦到当前选择框,
## 校验状态
`Adminlte3` 的大部分表单组件都有状态 `invalid`, `valid`, `warning`, `novalid`
- `invalid` : 无效状态
- `valid` : 有效状态
- `warning` : 警告状态
- `novalid` : 无状态
**注意:** valid **不支持** 按钮模式.
### feedback valid 状态
```html
<template>
<div>
<nly-form-radio-group
v-model="value"
:options="options"
:valid="state"
name="radio-validation"
>
<nly-form-feedback
:state="state"
:class='state==="invalid"?"d-block":null'
>Please select one</nly-form-feedback
>
<nly-form-feedback :state="state" :class='state==="valid"?"d-block":null'
>Thank you</nly-form-feedback
>
</nly-form-radio-group>
</div>
</template>
<script>
export default {
data() {
return {
value: null,
options: [
{ text: "First radio", value: "first" },
{ text: "Second radio", value: "second" },
{ text: "Third radio", value: "third" }
]
};
},
computed: {
state() {
if (this.value !== null) {
return "valid";
} else {
return "invalid";
}
}
}
};
</script>
<!-- valid.name -->
<!-- nly-form-radio-validation.vue -->
```