Skip to content

Commit c72b63e

Browse files
committed
Merge remote-tracking branch 'upstream/dev' into working
2 parents 3137511 + 2b9dbe1 commit c72b63e

33 files changed

+1556
-25
lines changed

docs/LANGS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44
* [2.0 - German](de/)
55
* [2.0 - Русский](ru/)
66
* [2.0 - 한국어(Korean)](kr/)
7+
* [2.0 - Español](es/)
78
* [0.7 Docs](old/)

docs/es/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{% include "./SUMMARY.md" %}

docs/es/SUMMARY.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# vue-router 2
2+
<!--email_off-->
3+
> Notas: vue-router@2.x funciona solamente con Vue 2.x. La documentación para la versión 0.7.x está [aquí (en inglés)](https://github.com/vuejs/vue-router/tree/1.0/docs/en).
4+
<!--/email_off-->
5+
**[Notas de lanzamiento](https://github.com/vuejs/vue-router/releases)**
6+
7+
- [Instalación](installation.md)
8+
- Esenciales
9+
- [Primeros pasos](essentials/getting-started.md)
10+
- [Matching dinámico de rutas](essentials/dynamic-matching.md)
11+
- [Sub-rutas](essentials/nested-routes.md)
12+
- [Navegación mediante código](essentials/navigation.md)
13+
- [Rutas con nombre](essentials/named-routes.md)
14+
- [Vistas con nombre](essentials/named-views.md)
15+
- [Redireccionamiento y alias](essentials/redirect-and-alias.md)
16+
- [Pasando propiedades a componentes de ruteo](essentials/passing-props.md)
17+
- [Modo historial HTML5](essentials/history-mode.md)
18+
- Avanzado
19+
- [Guardias de navegación](advanced/navigation-guards.md)
20+
- [Campos Meta en las rutas](advanced/meta.md)
21+
- [Transiciones](advanced/transitions.md)
22+
- [Obtención de datos](advanced/data-fetching.md)
23+
- [Comportamiento del scroll](advanced/scroll-behavior.md)
24+
- [Lazy loading](advanced/lazy-loading.md)
25+
- API
26+
- [router-link](api/router-link.md)
27+
- [router-view](api/router-view.md)
28+
- [El objeto Route](api/route-object.md)
29+
- [Opciones del constructor de Router](api/options.md)
30+
- [La instancia de Router](api/router-instance.md)
31+
- [Inyección en componentes](api/component-injections.md)

docs/es/advanced/data-fetching.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Obtención de datos
2+
3+
A veces es necesario obtener datos del servidor cuando una ruta es activada. Por ejemplo, antes de renderizar un perfil de usuario, puedes obtener la información de ese usuario desde el servidor. Podemos lograr esto de dos maneras diferentes:
4+
5+
- **Obtener la información después de la navegación**: realiza la navegación primero y luego obtén los datos en un _hook_ del ciclo de vida del componente entrante. Puedes mostrar un indicador de carga mientras se obtienen los datos.
6+
7+
- **Obtener la información antes de la navegación**: Obtén los datos antes de la navegación en la guardia de entrada de la ruta, y realiza la navegación una vez estos obtenidos.
8+
9+
Técnicamente, ambas opciones son válidas - todo depende de la experiencia de usuario a la que apuntes.
10+
11+
## Obtener la información después de la navegación
12+
13+
Cuando utilizamos este enfoque, navegamos y renderizamos el componente entrante inmediatamente, y obtenemos los datos en el _hook_ `created` del componente. Esto nos permite mostrar un indicador de estado de carga mientras se obtiene la información desde un servidor remoto, y también manejar la carga de datos según la ruta.
14+
15+
Asumamos que tenemos un componente `Post` que necesita obtener datos de un _post_ basándose en `$route.params.id`:
16+
17+
``` html
18+
<template>
19+
<div class="post">
20+
<div class="loading" v-if="loading">
21+
Loading...
22+
</div>
23+
24+
<div v-if="error" class="error">
25+
{{ error }}
26+
</div>
27+
28+
<div v-if="post" class="content">
29+
<h2>{{ post.title }}</h2>
30+
<p>{{ post.body }}</p>
31+
</div>
32+
</div>
33+
</template>
34+
```
35+
36+
``` js
37+
export default {
38+
data () {
39+
return {
40+
loading: false,
41+
post: null,
42+
error: null
43+
}
44+
},
45+
created () {
46+
// obtén los datos cuando la vista es creada y _data_ ya
47+
// está siendo observada
48+
this.fetchData()
49+
},
50+
watch: {
51+
// ejecuta nuevamente el método si la ruta cambia
52+
'$route': 'fetchData'
53+
},
54+
methods: {
55+
fetchData () {
56+
this.error = this.post = null
57+
this.loading = true
58+
// reemplaza getPost con lo que corresponda
59+
getPost(this.$route.params.id, (err, post) => {
60+
this.loading = false
61+
if (err) {
62+
this.error = err.toString()
63+
} else {
64+
this.post = post
65+
}
66+
})
67+
}
68+
}
69+
}
70+
```
71+
72+
## Obtener la información antes de la navegación
73+
74+
Con este enfoque, obtenemos la información antes de navegar a la nueva ruta. Podemos obtener los datos en el guardia `beforeRouteEnter` del componente entrante, y solo ejecutar `next` cuando se haya completado:
75+
76+
``` js
77+
export default {
78+
data () {
79+
return {
80+
post: null,
81+
error: null
82+
}
83+
},
84+
beforeRouteEnter (to, from, next) {
85+
getPost(to.params.id, (err, post) => {
86+
if (err) {
87+
// muestra algún mensaje global de error
88+
next(false)
89+
} else {
90+
next(vm => {
91+
vm.post = post
92+
})
93+
}
94+
})
95+
},
96+
// cuando la ruta cambie y este componente ya haya sido renderizado,
97+
// la lógica será ligeramente diferente
98+
watch: {
99+
$route () {
100+
this.post = null
101+
getPost(this.$route.params.id, (err, post) => {
102+
if (err) {
103+
this.error = err.toString()
104+
} else {
105+
this.post = post
106+
}
107+
})
108+
}
109+
}
110+
}
111+
```
112+
113+
El usuario permanecerá en la vista actual mientras se esté obteniendo el recurso para la vista entrante. Por lo tanto, es recomendable mostrar algún tipo de indicador o barra de progreso. Si la obtención de datos falla, es necesario mostrar algún tipo de advertencia global.

docs/es/advanced/lazy-loading.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Lazy loading
2+
3+
Cuando se construyen aplicaciones con un sistema de empaquetamiento de módulos, el archivo JavaScript resultante puede terminar siendo muy grande, afectando los tiempos de carga de la página. Sería más eficiente si pudiesemos dividir los componentes de cada ruta en porciones separadas y cargarlas solo cuando esa ruta es visitada.
4+
5+
Combinando [las características asíncronas de componentes de Vue](http://vuejs.org/guide/components.html#Async-Components) y las características de división de código de [Webpack](https://webpack.js.org/guides/code-splitting-require/), es trivial el _lazy loading_ de componentes de ruta.
6+
7+
Todo lo que necesitamos es definir nuestros componentes de rutas como asíncronos:
8+
9+
``` js
10+
const Foo = resolve => {
11+
// require.ensure es la sintaxis especial de Webpack para indicar un punto de división de código.
12+
require.ensure(['./Foo.vue'], () => {
13+
resolve(require('./Foo.vue'))
14+
})
15+
}
16+
```
17+
18+
Hay una alternativa a la sintaxis de división de código utilizando _require_ como lo hace AMD, por lo que puede simplificarse como:
19+
20+
``` js
21+
const Foo = resolve => require(['./Foo.vue'], resolve)
22+
```
23+
24+
Nada debe cambiarse en la configuración del _router_, solo utiliza `Foo` como lo harías normalmente:
25+
26+
``` js
27+
const router = new VueRouter({
28+
routes: [
29+
{ path: '/foo', component: Foo }
30+
]
31+
})
32+
```
33+
34+
### Agrupando componentes en la misma porción
35+
36+
A veces deseamos agrupar todos los componentes bajo la misma ruta en la misma porción asíncrona. Para lograr esto, necesitamos usar [porciones con nombre](https://webpack.js.org/guides/code-splitting-require/#chunkname) proveyendo un nombre de porción a `require.ensure` como el tercer argumento:
37+
38+
``` js
39+
const Foo = r => require.ensure([], () => r(require('./Foo.vue')), 'group-foo')
40+
const Bar = r => require.ensure([], () => r(require('./Bar.vue')), 'group-foo')
41+
const Baz = r => require.ensure([], () => r(require('./Baz.vue')), 'group-foo')
42+
```
43+
44+
Webpack agrupará los módulos asíncronos con el mismo nombre dentro de la misma porción asíncrona - esto también significa que no necesitamos más listar explícitamente las dependencias de `require.ensure` (por lo tanto pasamos un array vacío).

docs/es/advanced/meta.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Campos Meta en las rutas
2+
3+
Puedes incluir un campo `meta` cuando definas una ruta:
4+
5+
``` js
6+
const router = new VueRouter({
7+
routes: [
8+
{
9+
path: '/foo',
10+
component: Foo,
11+
children: [
12+
{
13+
path: 'bar',
14+
component: Bar,
15+
// campo meta
16+
meta: { requiresAuth: true }
17+
}
18+
]
19+
}
20+
]
21+
})
22+
```
23+
24+
Entonces, ¿como accedemos al campo `meta`?
25+
26+
Primero, cada objeto route en la configuración de `routes` se llama **registro de ruta**. Los registros de ruta pueden estar anidados. Por lo tanto, cuando una ruta coincida, existe la posibilidad que lo haga con más de un registro de ruta.
27+
28+
Por ejemplo, con la configuración anterior, la URL `/foo/bar` coincidirá tanto con el registro de ruta padre como con el hijo.
29+
30+
Todos los registros de rutas que hayan coincidido son expuestos en el objeto `$route` (y también a los objetos route en las guardias de navegación) como el array `$route.matched`. Por ende, necesitaremos iterar sobre `$route.matched` para verificar campos meta en los registros de rutas.
31+
32+
Un caso de uso de ejemplo es verificar la existencia de campos metas en los guardias de navegación global:
33+
34+
``` js
35+
router.beforeEach((to, from, next) => {
36+
if (to.matched.some(record => record.meta.requiresAuth)) {
37+
// esta ruta requiere autenticación, verificamos que haya iniciado sesión
38+
// sino, redirigimos a la página de inicio de sesión.
39+
if (!auth.loggedIn()) {
40+
next({
41+
path: '/login',
42+
query: { redirect: to.fullPath }
43+
})
44+
} else {
45+
next()
46+
}
47+
} else {
48+
next() // ¡Asegúrate de ejecutar next siempre!
49+
}
50+
})
51+
```

docs/es/advanced/navigation-guards.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# Guardias de navegación
2+
3+
Como el nombre sugiere, las guardias de navegación provistas por `vue-router` son básicamente utilizadas para proteger rutas de navegación ya sea redireccionando o cancelándolas. Hay varias maneras de engancharse en el proceso de navegación de rutas: globalmente, por ruta o dentro de los componentes.
4+
5+
Recuerda: **Los cambios en los parámetros o las _queries_ no harán que se ejecuten los guardias de navegación**. Simplemente [observa el objeto `$route`](../essentials/dynamic-matching.md#reacting-to-params-changes) para poder reaccionar frente a esos cambios.
6+
7+
### Guardias globales
8+
9+
Puedes registrar guardias _before_ globales utilizando `router.beforeEach`:
10+
11+
``` js
12+
const router = new VueRouter({ ... })
13+
14+
router.beforeEach((to, from, next) => {
15+
// ...
16+
})
17+
```
18+
19+
Las guardias _before_ globales son llamadas por orden de creación, cuando una navegación comienza. Las guardias pueden ejecutarse asincrónicamente, y la navegación se considera **pendiente** hasta que todos los _hooks_ sean resueltos.
20+
21+
Cada función guardia recibe tres argumentos:
22+
23+
- **`to: Route`**: el [Objeto Route](../api/route-object.md) hacia donde se navega.
24+
25+
- **`from: Route`**: la ruta actual desde la cual se navega.
26+
27+
- **`next: Function`**: esta función debe ser ejecutada para **resolver** el _hook_. La acción a realizar depende de los argumentos provistos a `next`:
28+
29+
- **`next()`**: moverse al siguiente _hook_ en la cadena. Si no queda ninguno, la navegación se **confirma**.
30+
31+
- **`next(false)`**: cancelar la navegación actual. Si la URL en el navegador cambió (ya sea manualmente o a través del botón _atrás_), será reseteada al valor de la ruta `from`.
32+
33+
- **`next('/')` o `next({ path: '/' })`**: redirecciona a una ruta diferente. La navegación actual será abortada y una nueva será iniciada.
34+
35+
**Asegúrese de llamar siempre a la función `next`, sino el _hook_ nunca será resuelto.**
36+
37+
También puedes registrar _hooks after_ globales. Sin embargo, a diferencia de las guardias, estos _hooks_ no reciben una función `next` y no pueden afectar la navegación:
38+
39+
``` js
40+
router.afterEach((to, from) => {
41+
// ...
42+
})
43+
```
44+
45+
### Guardias por ruta
46+
47+
Puedes definir guardias `beforeEnter` directamente en el objeto de configuración de una ruta:
48+
49+
``` js
50+
const router = new VueRouter({
51+
routes: [
52+
{
53+
path: '/foo',
54+
component: Foo,
55+
beforeEnter: (to, from, next) => {
56+
// ...
57+
}
58+
}
59+
]
60+
})
61+
```
62+
63+
Estos guardias tienen exactamente la misma firma que los guardias _before_ globales.
64+
65+
### Guardias en componentes
66+
67+
Por último, puedes directamente definir guardias de navegación dentro de los componentes de ruta (los que son pasados a la configuración del `router`) con las siguientes opciones:
68+
69+
- `beforeRouteEnter`
70+
- `beforeRouteUpdate` (agregado en la versión 2.2)
71+
- `beforeRouteLeave`
72+
73+
``` js
74+
const Foo = {
75+
template: `...`,
76+
beforeRouteEnter (to, from, next) {
77+
// se llama antes que la ruta que renderiza este componente sea confirmada.
78+
// NO tiene acceso a la instancia del componente `this`,
79+
// ¡porque no ha sido creada todavía cuando este guardia es ejecutado!
80+
},
81+
beforeRouteUpdate (to, from, next) {
82+
// se llama cuando la ruta que renderiza este componente ha cambiado,
83+
// pero este componente es reusado en la nueva ruta.
84+
// Por ejemplo, para una ruta con parámetros dinámicos /foo/:id, cuando
85+
// navegamos desde /foo/1 havia /foo/2, la misma instancia del componente Foo
86+
// será reusada, y este _hook_ será llamado cuando eso suceda.
87+
// Tiene acceso a la instancia del componente `this`
88+
},
89+
beforeRouteLeave (to, from, next) {
90+
// se llama cuando la ruta que renderiza el componente está por ser
91+
// abandonada.
92+
// Tiene acceso a la instancia del componente `this`
93+
}
94+
}
95+
```
96+
97+
La guardia `beforeRouteEnter` **NO** tiene acceso a `this`, porque es ejecutada antes que la navegación sea confirmada, por lo tanto el componente destino todavía no ha sido creado.
98+
99+
Sin embargo, puedes acceder a la instancia pasando una _función callback_ a `next`. La _función callback_ se ejecutará cuando la navegación sea confirmada, y la instancia del componente será pasada como argumento:
100+
101+
``` js
102+
beforeRouteEnter (to, from, next) {
103+
next(vm => {
104+
// accede a la instancia del componente a través de `vm`
105+
})
106+
}
107+
```
108+
109+
Puedes acceder directamente a `this` dentro de `beforeRouteLeave`. La guardia _leave_ se utiliza normalmente para prevenir al usuario cuando intenta abandonar la ruta accidentalmente sin guardar cambios. La navegación puede ser cancelada ejecutando `next(false)`.

0 commit comments

Comments
 (0)