<docs> --- order: 2 title: zh-CN: 方向 en-US: Direction --- ## zh-CN 这里列出了支持 `rtl` 方向的组件,您可以在演示中切换方向。 ## en-US Components which support rtl direction are listed here, you can toggle the direction in the demo. </docs> <template> <span style="margin-right: 16px">Change direction of components:</span> <a-radio-group v-model:value="state.direction"> <a-radio-button value="ltr">LTR</a-radio-button> <a-radio-button value="rtl">RTL</a-radio-button> </a-radio-group> <a-divider /> <a-config-provider :direction="state.direction"> <a-space direction="vertical" class="direction-components"> <a-row> <a-col :span="24"> <a-divider orientation="left">Cascader example</a-divider> <a-cascader :options="cascaderOptions" placeholder="یک مورد انتخاب کنید" :placement="state.popupPlacement" @change="onCascaderChange" > <template #suffixIcon><SearchIcon /></template> </a-cascader> With search: <a-cascader :options="cascaderOptions" placeholder="Select an item" :placement="state.popupPlacement" :show-search="{ filter: cascaderFilter }" @change="onCascaderChange" > <template #suffixIcon><SmileOutlined /></template> </a-cascader> </a-col> </a-row> <a-row> <a-col :span="12"> <a-divider orientation="left">Switch example</a-divider> <a-space> <a-switch default-checked /> <a-switch loading default-checked /> <a-switch size="small" loading /> </a-space> </a-col> <a-col :span="12"> <a-divider orientation="left">Radio Group example</a-divider> <a-radio-group default-value="c" button-style="solid"> <a-radio-button value="a">تهران</a-radio-button> <a-radio-button value="b" disabled>اصفهان</a-radio-button> <a-radio-button value="c">فارس</a-radio-button> <a-radio-button value="d">خوزستان</a-radio-button> </a-radio-group> </a-col> </a-row> <a-row> <a-col :span="12"> <a-divider orientation="left">Button example</a-divider> <div class="button-demo"> <a-button type="primary"> <template #icon><DownloadOutlined /></template> </a-button> <a-button type="primary" shape="circle"> <template #icon><DownloadOutlined /></template> </a-button> <a-button type="primary" shape="round"> <template #icon><DownloadOutlined /></template> </a-button> <a-button type="primary" shape="round"> <template #icon><DownloadOutlined /></template> Download </a-button> <a-button type="primary"> <template #icon><DownloadOutlined /></template> Download </a-button> <br /> <a-button-group> <a-button type="primary"> <LeftOutlined /> Backward </a-button> <a-button type="primary"> Forward <RightOutlined /> </a-button> </a-button-group> <a-button type="primary" loading>Loading</a-button> <a-button type="primary" size="small" loading>Loading</a-button> </div> </a-col> <a-col :span="12"> <a-divider orientation="left">Tree example</a-divider> <a-tree v-model:expandedKeys="expandedKeys" v-model:selectedKeys="selectedKeys" v-model:checkedKeys="checkedKeys" show-line checkable :tree-data="treeData" > <template #title="{ title, key }"> <span v-if="key === '0-0-1-0'" style="color: #1890ff">{{ title }}</span> <template v-else>{{ title }}</template> </template> </a-tree> </a-col> </a-row> <a-row> <a-col :span="24"> <a-divider orientation="left">Input (Input Group) example</a-divider> <a-space direction="vertical" style="width: 100%"> <a-input-group size="large"> <a-row :gutter="8"> <a-col :span="5"> <a-input default-value="0571" /> </a-col> <a-col :span="8"> <a-input default-value="26888888" /> </a-col> </a-row> </a-input-group> <a-input-group compact> <a-input style="width: 20%" default-value="0571" /> <a-input style="width: 30%" default-value="26888888" /> </a-input-group> <a-input-group compact> <a-select default-value="Option1"> <a-select-option value="Option1">Option1</a-select-option> <a-select-option value="Option2">Option2</a-select-option> </a-select> <a-input style="width: 50%" default-value="input content" /> <a-inputNumber /> </a-input-group> <a-input-search placeholder="input search text" enter-button="Search" size="large" /> <div style="margin-bottom: 16px"> <a-input default-value="mysite"> <template #selectBefore> <a-select default-value="Http://" style="width: 90px"> <a-select-option value="Http://">Http://</a-select-option> <a-select-option value="Https://">Https://</a-select-option> </a-select> </template> <template #selectAfter> <a-select default-value=".com" style="width: 80px"> <a-select-option value=".com">.com</a-select-option> <a-select-option value=".jp">.jp</a-select-option> <a-select-option value=".cn">.cn</a-select-option> <a-select-option value=".org">.org</a-select-option> </a-select> </template> </a-input> </div> <a-row> <a-col :span="12"> <a-divider orientation="left">Select example</a-divider> <a-space wrap> <a-select mode="multiple" default-value="مورچه" style="width: 120px"> <a-select-option value="jack">Jack</a-select-option> <a-select-option value="مورچه">مورچه</a-select-option> <a-select-option value="disabled" disabled>Disabled</a-select-option> <a-select-option value="Yiminghe">yiminghe</a-select-option> </a-select> <a-select default-value="مورچه" style="width: 120px" disabled> <a-select-option value="مورچه">مورچه</a-select-option> </a-select> <a-select default-value="مورچه" style="width: 120px" loading> <a-select-option value="مورچه">مورچه</a-select-option> </a-select> <a-select show-search style="width: 200px" placeholder="Select a person" option-filter-prop="children" :filter-option=" (input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 " > <a-select-option value="jack">Jack</a-select-option> <a-select-option value="سعید">سعید</a-select-option> <a-select-option value="tom">Tom</a-select-option> </a-select> </a-space> </a-col> <a-col :span="12"> <a-divider orientation="left">TreeSelect example</a-divider> <div> <a-tree-select show-search style="width: 100%" :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="Please select" allow-clear tree-default-expand-all :tree-data="treeSelectData" ></a-tree-select> </div> </a-col> </a-row> <a-row> <a-col :span="24"> <a-divider orientation="left">Modal example</a-divider> <div> <a-button type="primary" @click="showModal">Open Modal</a-button> <a-modal v-model:open="state.modalVisible" title="پنچره ساده"> <p>نگاشتههای خود را اینجا قراردهید</p> <p>نگاشتههای خود را اینجا قراردهید</p> <p>نگاشتههای خود را اینجا قراردهید</p> </a-modal> </div> </a-col> </a-row> <a-row> <a-col :span="24"> <a-divider orientation="left">Steps example</a-divider> <div> <a-steps progress-dot :current="state.currentStep" :items="[ { title: 'Finished', description: 'This is a description.', }, { title: 'In Progress', description: 'This is a description.', }, { title: 'Waiting', description: 'This is a description.', }, ]" ></a-steps> <br /> <a-steps :current="state.currentStep" :items="[ { title: 'Step 1', description: 'This is a description.', }, { title: 'Step 2', description: 'This is a description.', }, { title: 'Step 3', description: 'This is a description.', }, ]" @change="onStepsChange" ></a-steps> </div> </a-col> </a-row> <a-row> <a-col :span="12"> <a-divider orientation="left">Rate example</a-divider> <div> <a-rate v-model:value="rateValue" /> <br /> <strong>* Note:</strong> Half star not implemented in RTL direction. </div> </a-col> <a-col :span="12"> <a-divider orientation="left">Badge example</a-divider> <div> <div> <a-badge :count="state.badgeCount"> <a href="#" class="head-example" /> </a-badge> <a-button-group> <a-button @click="declineBadge"> <MinusOutlined /> </a-button> <a-button @click="increaseBadge"> <PlusOutlined /> </a-button> </a-button-group> </div> <div style="margin-top: 10px"> <a-badge :dot="state.showBadge"> <a href="#" class="head-example" /> </a-badge> <a-switch :checked="state.showBadge" @change="onChangeBadge" /> </div> </div> </a-col> </a-row> </a-space> </a-col> </a-row> <a-row> <a-col :span="24"> <a-divider orientation="left">Pagination example</a-divider> <a-pagination show-size-changer :default-current="3" :total="500" /> </a-col> </a-row> <a-row> <a-col :span="24"> <a-divider orientation="left">Grid System example</a-divider> <div class="grid-demo"> <div class="code-box-demo"> <p> <strong>* Note:</strong> Every calculation in RTL grid system is from right side (offset, push, etc.) </p> <a-row> <a-col :span="8">col-8</a-col> <a-col :span="8" :offset="8">col-8</a-col> </a-row> <a-row> <a-col :span="6" :offset="6">col-6 col-offset-6</a-col> <a-col :span="6" :offset="6">col-6 col-offset-6</a-col> </a-row> <a-row> <a-col :span="12" :offset="6">col-12 col-offset-6</a-col> </a-row> <a-row> <a-col :span="18" :push="6">col-18 col-push-6</a-col> <a-col :span="6" :pull="18">col-6 col-pull-18</a-col> </a-row> </div> </div> </a-col> </a-row> </a-space> </a-config-provider> </template> <script lang="ts" setup> import { reactive, watch, ref } from 'vue'; import { SearchOutlined as SearchIcon, SmileOutlined, DownloadOutlined, LeftOutlined, RightOutlined, MinusOutlined, PlusOutlined, } from '@ant-design/icons-vue'; import type { TreeProps, TreeSelectProps, CascaderProps } from 'ant-design-vue'; const state = reactive({ currentStep: 0, modalVisible: false, badgeCount: 5, showBadge: true, direction: 'ltr' as 'ltr' | 'rtl', popupPlacement: 'bottomLeft' as CascaderProps['placement'], }); const expandedKeys = ref<string[]>(['0-0-0', '0-0-1']); const selectedKeys = ref<string[]>(['0-0-0', '0-0-1']); const checkedKeys = ref<string[]>(['0-0-0', '0-0-1']); const treeData: TreeProps['treeData'] = [ { title: 'parent 1', key: '0-0', children: [ { title: 'parent 1-0', key: '0-0-0', disabled: true, children: [ { title: 'leaf', key: '0-0-0-0', disableCheckbox: true }, { title: 'leaf', key: '0-0-0-1' }, ], }, { title: 'parent 1-1', key: '0-0-1', children: [{ key: '0-0-1-0', title: 'sss' }], }, ], }, ]; const treeSelectData = ref<TreeSelectProps['treeData']>([ { title: 'parent 1', value: 'parent 1', children: [ { title: 'parent 1-0', value: 'parent 1-0', children: [ { title: 'my leaf', value: 'leaf1', }, { title: 'your leaf', value: 'leaf2', }, ], }, { title: 'parent 1-1', value: 'parent 1-1', }, ], }, ]); watch( () => state.direction, directionValue => { if (directionValue === 'rtl') { state.popupPlacement = 'bottomRight'; } else { state.popupPlacement = 'bottomLeft'; } }, ); const cascaderOptions = [ { value: 'tehran', label: 'تهران', children: [ { value: 'tehran-c', label: 'تهران', children: [ { value: 'saadat-abad', label: 'سعادت آیاد', }, ], }, ], }, { value: 'ardabil', label: 'اردبیل', children: [ { value: 'ardabil-c', label: 'اردبیل', children: [ { value: 'primadar', label: 'پیرمادر', }, ], }, ], }, { value: 'gilan', label: 'گیلان', children: [ { value: 'rasht', label: 'رشت', children: [ { value: 'district-3', label: 'منطقه ۳', }, ], }, ], }, ]; // ==== Cascader ==== const cascaderFilter = (inputValue, path) => path.some(option => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1); const onCascaderChange = value => { console.log(value); }; // ==== End Cascader ==== // ==== Modal ==== const showModal = () => { state.modalVisible = true; }; // ==== End Modal ==== const onStepsChange = currentStep => { console.log('onChange:', currentStep); state.currentStep = currentStep; }; // ==== Badge ==== const increaseBadge = () => { const badgeCount = state.badgeCount + 1; state.badgeCount = badgeCount; }; const declineBadge = () => { let badgeCount = state.badgeCount - 1; if (badgeCount < 0) { badgeCount = 0; } state.badgeCount = badgeCount; }; const onChangeBadge = showBadge => { state.showBadge = showBadge; }; const rateValue = ref(2); </script> <style lang="less" scoped> .direction-components { width: 100%; .button-demo .ant-btn, .button-demo .ant-btn-group { margin-right: 8px; margin-bottom: 12px; } .button-demo .ant-btn-group > .ant-btn, .button-demo .ant-btn-group > span > .ant-btn { margin-right: 0; margin-left: 0; } .head-example { display: inline-block; width: 42px; height: 42px; vertical-align: middle; background: #eee; border-radius: 4px; } .ant-badge:not(.ant-badge-not-a-wrapper) { margin-right: 20px; } .ant-badge-rtl:not(.ant-badge-not-a-wrapper) { margin-right: 0; margin-left: 20px; } } [data-theme='dark'] .head-example { background: rgba(255, 255, 255, 0.12); } </style>