index.scss
$themeColor: 'red'
:export {
theme: $themeColor;
}
index.js
import color from "index.scss";
let themeColor = color.theme;
export { themeColor };
- 新建路由 replace.vue
router.js
...
{
path: '/redirect',
name: 'redirect',
hidden: true,
component: () => import('/@/views/redirect.vue')
}
...
redirect.vue
<script>
import { useRoute, useRouter } from 'vue-router'
export default {
setup(){
let router = useRouter()
let route = useRoute()
const { params, query } = route
console.log(route);
router.replace({
name: params.__name,
params,query
})
}
}
</script>
- 在需要方法里面写入
router.replace({
name: "redirect",
params: {
...params,
__name: name,
},
query,
});
- 在每个页面引入
// 引入
import { ElMessage } from "element-plus";
// 使用
ElMessage.success("ok");
- provide/inject
// main.ts
import { ElMessage } from "element-plus";
const app = createApp(App);
app.provide("$message", ElMessage);
// index.vue
(inject('$message') as any).success("inject");
- 在每个页面引入
// 引入
import { ElMessageBox } from "element-plus";
// 使用
ElMessageBox.confirm(...);
对应于上述四个全局方法的调用方法依次为:ElMessageBox, ElMessageBox.alert, ElMessageBox.confirm 和 ElMessageBox.prompt
调用参数与全局方法相同。
- provide/inject
// main.ts
import { ElMessageBox } from "element-plus";
const app = createApp(App);
app.provide("messageBox", ElMessageBox);
// index.vue
(inject('messageBox') as any).confirm(...);
import {
h,
withScopeId,
getCurrentInstance,
} from "vue";
const instance = getCurrentInstance();
const withId = withScopeId((instance as any).type.__scopeId);
return withId(() =>
h("div")
);
// 定义变量
$--el-color-primary: #409eff !default;
div{
color: var(--el-color-primary)!important;
}
// 挂载到 root 上
:root{
color: #{$--el-color-primary};
}
Js 修改样式
document.documentElement.style.setProperty('--el-color-primary', 'red')
- 安装
yarn add @vitejs/plugin-vue-jsx
// or
npm install @vitejs/plugin-vue-jsx -D
- 配置
在 vite.config.ts
文件中挂载
import vueJsx from '@vitejs/plugin-vue-jsx'
export default defineConfig({
plugins: [ vueJsx()]
})
tsconfig.json
文件中
{
// include 需要包含tsx
"include": ["src/*", "src/**/*.vue", "src/**/*.tsx", "src/**/*.jsx", "src/**/*.ts", "src/**/*.js"],
"compilerOptions": {
// 在.tsx文件里支持JSX
"jsx": "preserve",
}
}
- 使用 (1) 新建**.tsx
// index.tsx
export default definedComponents({
setup(props){
return ()=>(
<div>
Hello,World
</div>
)
}
})
(2) 新建**.vue
不需要template
。script
上加lang='tsx'
// index.vue
<script lang='tsx'>
import {definedComponents} from 'vue'
export default definedComponents({
setup(props){
return ()=>(
<div>
Hello,World
</div>
)
}
})
</script>
-
文档 jsx语法
See
https://github.com/vuejs/jsx-next#babel-plugin-jsx-for-vue-30 -
探坑
-
jsx/tsx中循环出来的标签元素上有点击事件的话 会自动调用事件
// 例如
export default definedComponents({
import {definedComponents} from 'vue'
setup(props){
// 会被调用3次
const click = (val)=>{
consloe.log(val)
// 112
// 112
// 112
}
return ()=>(
<>
{[1,2,3].map((item,index)=>{
return (
// 而且 这样写拿不到原生事件 event
<div onClick={click('112')}><>
)
})}
</>
)
}
})
正确应该是 onClick={(e)=>{click(e,'112')}} 这样也可以拿到原生事件
// jsx/tsx中循环出来的标签元素上有点击事件的话 会自动调用事件
// 例如
export default definedComponents({
setup(props){
// 只有点击时执行
const click = (e,val)=>{
consloe.log(e,val)
}
return ()=>(
<>
{[1,2,3].map((item,index)=>{
return (
<div onClick={(e)=>{click(e,'112')}}><>
)
})}
</>
)
}
})
- jsx中 使用 transition
import {Transition,ref,definedComponents} from 'vue'
export default definedComponents({
setup(props){
// 只有点击时执行
const a = ref(false)
return ()=>(
<>
<Transition>
<div v-show={a}></div>
</Transition>
</>
)
}
})
- jsx中 使用 阻止冒泡
export default definedComponents({
setup(props){
// 只有点击时执行
const a = ()=>{
}
return ()=>(
<>
<div onClick={(e: any) => {
e.stopPropagation(a());
}}></div>
</>
)
}
})
// node_modules/mockjs/dist/mock.js
function handle(event) {
// 同步属性 NativeXMLHttpRequest => MockXMLHttpRequest
for (var i = 0; i < XHR_RESPONSE_PROPERTIES.length; i++) {
try {
that[XHR_RESPONSE_PROPERTIES[i]] = xhr[XHR_RESPONSE_PROPERTIES[i]]
} catch (e) {}
}
// 触发 MockXMLHttpRequest 上的同名事件
that.dispatchEvent(new Event(event.type /*, false, false, that*/ ))
}
MockXMLHttpRequest.prototype.upload = createNativeXMLHttpRequest().upload // 8307 添加此行
// 如果未找到匹配的数据模板,则采用原生 XHR 发送请求。
...
- 下载成功打不开
// node_modules/mockjs/dist/mock.js
// 原生 XHR
if (!this.match) {
// 8364行添加
this.custom.xhr.responseType = this.responseType
this.custom.xhr.send(data)
return
}