对话框

QDialog 组件提供了一种很棒的交互方式,您可以通过对话框来向用户展示重要信息,或者请求用户做出决策。

从 UI 的角度来看,您可以把对话框看作一种浮动的模态框,它只覆盖屏幕的一部分,也代表着对话框应该只被用于处理用户的快速操作,例如验证密码,简短的应用通知,或者做出快速选择等等。

TIP

对话框还可以通过更基础的方式来使用,把它当作一个全局的方法来调用,就像原生 js 的 alert(), prompt() 等方法一样。更多信息,请参考 Dialog 插件页面

进阶提示

与其将 QDialog 杂揉在您的 .vue 文件的模板中,不如为对话框写一个组件,并用 Dialog 插件使它可以在应用的任何地方都可以被很方便的调用。

QDialog API

Loading QDialog API...

用法

注意

QDialog 最好使用 QCard 作为主要内容。如果您想使用其他的组件或者标签,请确保 QDialog 的直接子元素是 <div> 标签(或者手动为他包裹一个 <div>)。

基础




样式




定位




TIP

不要将 “position” 属性与显示隐藏的动画相混淆。如果您想自定义动画,您可以使用 transition-showtransition-hide 属性,不管 “position” 或 “maximized” 如何设置,它们都会生效。




不同的内容

对话框可以包含任何内容。一些示例:







TIP

当您想使用容器化的 QLayout 时,如果使用左/右定位,则需要为 QDialog 设置一个宽度,如果使用上/下定位。则需要为 QDialog 设置一个高度。您可以使用 vw 和 vh 单位。

处理滚动




不同的模式

用户无法通过 ESCAPE 键或者点击对话框外部来关闭对话框。




对话框也可以成为页面的一部分,不需要立即聚焦,这就是“无缝”(seamless)模式的作用:




嵌套

您可以在其他对话框之上打开对话框,没有深度限制。




大小

您可以自定义对话框的大小。请注意,我们要么修改内容的样式,要么使用full-widthfull-height 属性:




Cordova/Capacitor 返回按钮

Quasar 默认为您处理返回按钮,所以它会关闭任何打开的对话框,而不是默认返回到前一页(这不是一个很好的用户体验)。

但是,如果您希望禁用此行为,请编辑/quasar.config。js 文件:

// quasar.config.js;
// for Cordova (only!):
return {
  framework: {
    config: {
      cordova: {
         // quasar 处理手机返回键使应用程序退出。
        backButtonExit: true/false/'*'/['/login', '/home', '/my-page'],

        // 下面这个配置开启会完全禁用 quasar 管理手机的返回按钮。
        backButton: true/false
      }
    }
  }
}

// quasar.config.js;
// for Capacitor (only!)
return {
  framework: {
    config: {
      capacitor: {
        // quasar 处理手机返回键使应用程序退出。
        backButtonExit: true/false/'*'/['/login', '/home', '/my-page'],

        // 下面这个配置开启会完全禁用 quasar 管理手机的返回按钮。
        backButton: true/false
      }
    }
  }
}

类型定义

查看类型定义
type InputType =
  | "button"
  | "checkbox"
  | "color"
  | "date"
  | "datetime-local"
  | "email"
  | "file"
  | "hidden"
  | "image"
  | "month"
  | "number"
  | "password"
  | "radio"
  | "range"
  | "reset"
  | "search"
  | "submit"
  | "tel"
  | "text"
  | "time"
  | "url"
  | "week";
type DatalessInputType = Extract<InputType, "submit" | "reset">;

type PromptInputType = "textarea" | Exclude<InputType, DatalessInputType>;

type DataAttributes = {
  
  [dataAttributes in `data-${string}`]?: any;
} & {
  "data-cy"?: string;
};

export type QDialogInputPrompt<T = string> = {
  /**
   * The initial value of the input
   */
  model: T;
  /**
   * Optional property to determine the input field type
   *
   * @defaultValue "text"
   */
  type?: PromptInputType;

  /**
   * Is typed content valid?
   *
   * @param val The value of the input
   * @returns The text passed validation or not
   */
  isValid?: (value: T) => boolean;
} & Partial<Omit<QInputProps, "modelValue" | "onUpdate:modelValue" | "type">> &
  Omit<InputHTMLAttributes, "type"> &
  DataAttributes;

type SelectionPromptType = NonNullable<QOptionGroupProps["type"]>;
export type QDialogSelectionPrompt<
  
  
  
  TType extends SelectionPromptType = SelectionPromptType,
  TModel = TType extends "radio" ? string : readonly any[],
> = {
  /**
   * The value of the selection
   * If the `type` is "radio"(default), the value is a string, otherwise it's an array
   */
  model: TModel;

  /**
   * The type of the selection
   *
   * @defaultValue "radio"
   */
  type?: TType;

  /**
   * The list of options to interact with
   * Equivalent to `options` prop of the `QOptionGroup` component
   */
  items?: QOptionGroupProps["options"];

  /**
   * Is the model valid?
   *
   * @param model The current model (If the `type` is "radio"(default), the value is a string, otherwise it's an array)
   * @returns The selection passed validation or not
   */
  isValid?: (value: TModel) => boolean;
} & Partial<
  Omit<
    QOptionGroupProps,
    "modelValue" | "onUpdate:modelValue" | "type" | "options"
  >
> &
  HTMLAttributes &
  DataAttributes;