<style>
@component-namespace demo {
  @b popup {
    .van-button {
      margin: 10px 15px;
    }

    .van-popup-1 {
      width: 60%;
      box-sizing: border-box;
      padding: 20px;
      border-radius: 5px;
      text-align: center;
    }

    .van-popup-2 {
      width: 100%;
      height: 200px;
      box-sizing: border-box;
      padding: 20px;
    }

    .van-popup-3 {
      line-height: 50px;
      text-align: center;
      background-color: rgba(0, 0, 0, 0.701961);
      color: #fff;
    }

    .van-popup-4,
    .van-popup-5 {
      width: 100%;
      height: 100%;
    }
  }
}
</style>

<script>
import MobileComputed from 'components/mobile-computed';
import Dialog from 'packages/dialog';

export default {
  mixins: [MobileComputed],

  data() {
    return {
      popupShow1: false,
      popupShow2: false,
      popupShow3: false,
      popupShow4: false,
      popupShow5: false
    }
  },

  watch: {
    popupShow3(val) {
      if (val) {
        setTimeout(() => {
          this.popupShow3 = false;
        }, 2000);
      }
    }
  },

  methods: {
    showDialog() {
      Dialog.confirm({
        title: 'confirm标题',
        message: '弹窗提示文字,左右始终距离边20PX,上下距离20PX,文字左对齐。弹窗提示文字,左右始终距离边20PX,上下距离20PX,文字左对齐。'
      }).then((action) => {
        console.log(action);
      }, (error) => {
        console.log(error);
      });
    }
  }
};
</script>

## Popup 弹出菜单

### 使用指南

如果你已经按照快速上手中引入了整个`vant`,以下**组件注册**就可以忽略了,因为你已经全局注册了`vant`中的全部组件。

#### 全局注册

你可以在全局注册`Popup`组件,比如页面的主文件(`index.js`,`main.js`),这样页面任何地方都可以直接使用`Popup`组件了:

```js
import Vue from 'vue';
import { Popup } from 'vant';
import 'vant/lib/vant-css/popup.css';

Vue.component(Popup.name, Popup);
```

#### 局部注册

如果你只是想在某个组件中使用,你可以在对应组件中注册`Popup`组件,这样只能在你注册的组件中使用`Popup`:

```js
import { Popup } from 'vant';
import 'vant/lib/vant-css/popup.css';

export default {
  components: {
    'van-popup': Popup
  }
};
```

### 代码演示

#### 基础用法

`popup`默认情况下是从中间弹出。

:::demo 基础用法
```html
<van-button @click="popupShow1 = true">从中间弹出popup</van-button>
<van-popup v-model="popupShow1" class="van-popup-1" :lock-on-scroll="true">
  从中间弹出popup
</van-popup>

<script>
export default {
  data() {
    return {
      popupShow1: false
    }
  }
};
</script>
```
:::

#### 从不同位置弹出菜单

可以设置`position`属性,`popup`即能从不同位置弹出,`position`的可选值有`top`,`bottom`,`right`,`left`。

:::demo 从不同位置弹出菜单
```html
<van-button @click="popupShow2 = true;">从下方弹出popup</van-button>
<van-popup v-model="popupShow2" position="bottom" class="van-popup-2">
  <van-button @click="showDialog">弹出dialog</van-button>
</van-popup>

<van-button @click="popupShow3 = true">从上方弹出popup</van-button>
<van-popup v-model="popupShow3" position="top" class="van-popup-3" :overlay="false">
  更新成功
</van-popup>

<van-button @click="popupShow4 = true">从右方弹出popup</van-button>
<van-popup v-model="popupShow4" position="right" class="van-popup-4" :overlay="false">
  <van-button @click.native="popupShow4 = false">关闭 popup</van-button>
</van-popup>


<van-button @click="popupShow5 = true">从左方弹出popup</van-button>
<van-popup v-model="popupShow5" position="left" class="van-popup-5" :overlay="false">
  <van-button @click.native="popupShow5 = false">关闭 popup</van-button>
</van-popup>

<script>
export default {
  data() {
    return {
      popupShow1: false,
      popupShow2: false,
      popupShow3: false,
      popupShow4: false
    }
  },

  watch: {
    popupShow2(val) {
      if (val) {
        setTimeout(() => {
          this.popupShow2 = false;
        }, 2000);
      }
    }
  }
};
</script>
```
:::

点击以下按钮查看手机端效果:

<van-button @click="mobileShow = true">点击查看手机端效果</van-button>
<mobile-popup v-model="mobileShow" :url="mobileUrl"></mobile-popup>

### API

| 参数       | 说明      | 类型       | 默认值       | 可选值       |
|-----------|-----------|-----------|-------------|-------------|
| value | 利用`v-model`绑定当前组件是否显示 | `boolean`  | `false` | `true`, `false`  |
| overlay | 是否显示背景遮罩层 | `boolean`  | `true` | `true`, `false`  |
| lockOnScroll | 背景是否跟随滚动 | `boolean`  | `false` | `true`, `false`  |
| position | 弹出菜单位置 | `string`  |  | `top`, `bottom`, `right`, `left`  |
| closeOnClickOverlay | 点击遮罩层是否关闭弹出菜单 | `boolean`  | `true` | `true`, `false`  |
| transition | 弹出菜单的`transition` | `string`  | `popup-slide` |   |