diff --git a/packages/components/teleport/__tests__/teleport.spec.ts b/packages/components/teleport/__tests__/teleport.spec.ts
new file mode 100644
index 0000000000..ceaa927458
--- /dev/null
+++ b/packages/components/teleport/__tests__/teleport.spec.ts
@@ -0,0 +1,40 @@
+import { mount } from '@vue/test-utils'
+import Teleport from '../src/teleport.vue'
+
+const AXIOM = 'rem is the best girl'
+
+describe('', () => {
+ let wrapper
+ beforeEach(() => {
+ wrapper = mount(Teleport, {
+ slots: { default: () => AXIOM },
+ })
+ })
+
+ afterEach(() => {
+ wrapper.unmount()
+ })
+
+ it('should render slot correctly', () => {
+ expect(wrapper.text()).toBe('')
+ expect(document.body.textContent).toBe(AXIOM)
+ expect(wrapper.vm.containerRef).toBeDefined()
+ })
+
+ describe('props', () => {
+ it('should be able to set customized style', async () => {
+ const style = {
+ color: 'red',
+ }
+
+ await wrapper.setProps({ style })
+ expect(getComputedStyle(wrapper.vm?.containerRef).color).toBe(style.color)
+ })
+
+ it('should be able to set z-index', async () => {
+ const zIndex = '10000'
+ await wrapper.setProps({ zIndex })
+ expect(getComputedStyle(wrapper.vm?.containerRef).zIndex).toBe(zIndex)
+ })
+ })
+})
diff --git a/packages/components/teleport/index.ts b/packages/components/teleport/index.ts
new file mode 100644
index 0000000000..607dcc348e
--- /dev/null
+++ b/packages/components/teleport/index.ts
@@ -0,0 +1,8 @@
+import { withInstall } from '@element-plus/utils/with-install'
+import Teleport from './src/teleport.vue'
+
+export const ElTeleport = withInstall(Teleport)
+
+export default ElTeleport
+
+export * from './src/teleport'
diff --git a/packages/components/teleport/src/teleport.ts b/packages/components/teleport/src/teleport.ts
new file mode 100644
index 0000000000..b1b75eadce
--- /dev/null
+++ b/packages/components/teleport/src/teleport.ts
@@ -0,0 +1,19 @@
+import { buildProps, definePropType } from '@element-plus/utils/props'
+
+import type { ExtractPropTypes, StyleValue } from 'vue'
+
+export const elTeleportProps = buildProps({
+ container: {
+ type: definePropType([String, Object]),
+ default: 'body',
+ },
+ style: {
+ type: definePropType([String, Array, Object]),
+ },
+ zIndex: {
+ type: String,
+ default: '2000',
+ },
+})
+
+export type ElTeleportProps = ExtractPropTypes
diff --git a/packages/components/teleport/src/teleport.vue b/packages/components/teleport/src/teleport.vue
new file mode 100644
index 0000000000..513f5db645
--- /dev/null
+++ b/packages/components/teleport/src/teleport.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/components/teleport/style/css.ts b/packages/components/teleport/style/css.ts
new file mode 100644
index 0000000000..7475d66381
--- /dev/null
+++ b/packages/components/teleport/style/css.ts
@@ -0,0 +1 @@
+/* Empty file for avoiding plugin error */
diff --git a/packages/components/teleport/style/index.ts b/packages/components/teleport/style/index.ts
new file mode 100644
index 0000000000..7475d66381
--- /dev/null
+++ b/packages/components/teleport/style/index.ts
@@ -0,0 +1 @@
+/* Empty file for avoiding plugin error */
diff --git a/packages/hooks/use-popper/index.ts b/packages/hooks/use-popper/index.ts
index 65d4635250..bf4768dd86 100644
--- a/packages/hooks/use-popper/index.ts
+++ b/packages/hooks/use-popper/index.ts
@@ -134,8 +134,8 @@ export const usePopperProps = {
}
export const usePopperHook = () => {
- const vm = getCurrentInstance()
- const props: ExtractPropTypes = vm.props as any
+ const vm = getCurrentInstance()!
+ const props: ExtractPropTypes = vm.proxy?.$props as any
const { slots } = vm
const arrowRef = ref(null)