Skip to main content
Svelte基础
介绍
响应
属性Props
逻辑表达式
事件
绑定
Classes和样式
动作Actions
转场
Svelte高阶
响应式进阶
内容复用
动画
高级绑定
高级转场
上下文API
特殊元素
脚本模块
接下来
SvelteKit基础
介绍
路由
加载数据
Headers和cookies
Shared modules
Forms
API routes
$app/state
Errors and redirects
Advanced SvelteKit
Hooks
Page options
Link options
Advanced routing
Advanced loading
Environment variables
Conclusion

小主可能经常需要跟踪某个状态的变化情况,特别是在排查Bug的时候。

It’s often useful to be able to track the value of a piece of state as it changes over time.

小主是不是想到了使用console.log, 就像在addNumber中那样!?但是当打开浏览器控制台(可以点击地址栏右边的按钮打开),你会看到一条消息说“这条消息是不可克隆的”。

Inside the addNumber function, we’ve added a console.log statement. But if you click the button and open the console drawer (using the button to the right of the URL bar), you’ll see a warning, and a message saying the message could not be cloned.

别急小主,这是因为numbers是个响应代理, 我们有几种方法可以修复这个问题,比如使用$state.snapshot(...)创建一个非响应的 快照

That’s because numbers is a reactive proxy. There are a couple of things we can do. Firstly, we can create a non-reactive snapshot of the state with $state.snapshot(...):

App
function addNumber() {
	numbers.push(numbers.length + 1);
	console.log($state.snapshot(numbers));
}

另外我们还可以使用$inspect符文(rune)自动地在状态改变时记录下它的快照。更贴心地是这些代码会在正式发布应用时(为正式生产构建时)自动剔除:

Alternatively, we can use the $inspect rune to automatically log a snapshot of the state whenever it changes. This code will automatically be stripped out of your production build:

App
function addNumber() {
	numbers.push(numbers.length + 1);
	console.log($state.snapshot(numbers));
}

$inspect(numbers);

另外还可以使用$inspect(...).with(fn)自定义信息展示方式。比如可以使用console.trace查看状态是在什么地方被改变的。

You can customise how the information is displayed by using $inspect(...).with(fn) — for example, you can use console.trace to see where the state change originated from:

App
$inspect(numbers).with(console.trace);

小主,你说Svelte是不是很贴心?!

Edit this page on GitHub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
	let numbers = $state([1, 2, 3, 4]);
	let total = $derived(numbers.reduce((t, n) => t + n, 0));
 
	function addNumber() {
		numbers.push(numbers.length + 1);
		console.log(numbers);
	}
</script>
 
<p>{numbers.join(' + ')} = {total}</p>
 
<button onclick={addNumber}>
	Add a number
</button>