## Session
在客户端,`Session`提供了一个全局对象,可以用它来保存任意的键值对。例如:保存列表中当前选中项。
`Session`的特殊之处在于,它是_响应式_的。如果在[template helper](#template_helpers)或[`Tracker.autorun`](#tracker_autorun)里调用了 `Session.get("myKey")`,那么无论何时调用`Session.set("myKey", newValue)` 都会触发相应的模板片段自动重新渲染。
### [Session.set(key, value)](#/basic/Session-set)
Client
将session里键key的值设为value。并通知所有监听器:键key的值发生了变化(例如:通知那些调用[`Session.get`](#session_get)获取键`key`值的模板helper或是autorun,重新渲染模板或是重新执行[`Tracker.autorun`](#tracker_autorun))。
#### Arguments
key String
The key to set, eg, `selectedItem`
value [EJSON-able Object](#ejson) or undefined
The new value for `key`
### [Session.get(key)](#/basic/Session-get)
Client
获取session里键key的值。如果是在一个_[响应式计算(reactive computation)](#reactivity)_内部。当通过[`Session.set`](#session_set)修改键key的值时,会作废对应的计算。这个方法会返回键key值的克隆副本,所以如果键key的值是一个对象或数组,修改返回值并不会改变session里键key的值。
#### Arguments
key String
The name of the session variable to return
例如:
```
<!-- In your template -->
<template name="main">
<p>We've always been at war with {{theEnemy}}.</p>
</template>
```
```
// In your JavaScript
Template.main.helpers({
theEnemy: function () {
return Session.get("enemy");
}
});
Session.set("enemy", "Eastasia");
// Page will say "We've always been at war with Eastasia"
Session.set("enemy", "Eurasia");
// Page will change to say "We've always been at war with Eurasia"
```
`Seesion`带我们初次体会到了_响应式_的魅力,视图会在必要时自动更新,无需手动调用`render`函数。 在下一节,将会学习如何使用Tracker,一个非常轻量的库,使响应式成为可能。