Vue Router 路由
配置
配置 Route
import路径为相对于当前文件的路径。
const routes = [
{
path: "/path",
component: () => import("path-to-page.vue")
},
// ...
]
使用 @ 指定根目录
要在import路径中使用@符号来代表指定的根目录,需要进行配置。
在 vite.config.js
中,添加resolve
属性。
Vue3 基础
响应式
监听数据改动并自动更新。
使用ref()
和reactive()
包装值,生成Proxy代理,劫持对象的调用和操作。
get时,将自身添加为被依赖值,进行依赖收集。(effect中会设置当前执行的函数)
set时,触发更新,重新调用依赖自身的函数。
绑定属性
- 全写:
v-bind:name="xxx"
- 简写:
:name="xxx"
绑定事件
- 全写:
v-on:event="xxx"
简写:
@event="xxx"
ASPX 标签
<% C#代码 %>
可以在网页渲染时执行代码。
<% for(int i=0; i<5; i+=1) { %>
<% Response.Write("<br>" + i) %>
<% } %>
<%= C#代码 %>
等同于调用Response.Write(...)
。
public string GetDate() {
return DateTime.Now.ToString("yyyy-MM-dd");
}
Today is <%= GetDate() %>
DataGridView
使用错误容器时的巨坑
使用 List 作为 DataSource。点击单元格时,就算没有单元格点击事件,也会在外层(父窗体 ShowDialog 子窗体的位置)报 IndexOutOfRange 下标越界异常。
解决方法:只要是用于 DGV 显示的列表,一律用BindingList
。
BindingList
用ResetBinding()
(对于整个列表)或ResetItem(i)
(对于特定元素)来手动触发“列表已改变”事件。
用RaiseListChangedEvents
属性控制 BindingList 是否会发出“列表已改变”的事件。
注意:这个属性不仅控制添加和删除元素时是否会自动触发事件,同时也控制ResetBinding() / ResetItem(i)
这类手动触发事件的方法是否会触发事件。
添加向列表大量元素时的标准流程:
list.RaiseListChangedEvents = false;
list.Clear();
foreach(var item in source)
{
list.Add(item);
}
// 一定要先启用事件,然后再手动触发事件。
list.RaiseListChangedEvents = true;
list.ResetBindings();
屏幕旋转
检测屏幕方向:
int orientation = getResources().getConfiguration().orientation;
boolean landscape = (orientation == Configuration.ORIENTATION_LANDSCAPE);
强制Activity横屏
AndroidManifest里给Activity标签添加属性:
android:screenOrientation="landscape"
切换时自动重建
创建layout时在Qualifier列表中添加Orientation属性。调用R.layout.xxx时会自动根据屏幕方向选择对应的layout。