1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- <template>
- <router-link
- class="nav-link"
- :to="link"
- @focusout.native="focusoutAction"
- v-if="isInternal"
- :exact="exact"
- >{{ item.text }}</router-link>
- <a
- v-else
- :href="link"
- @focusout="focusoutAction"
- class="nav-link external"
- :target="target"
- :rel="rel"
- >
- {{ item.text }}
- <OutboundLink v-if="isBlankTarget"/>
- </a>
- </template>
- <script>
- import { isExternal, isMailto, isTel, ensureExt } from '../util'
- export default {
- props: {
- item: {
- required: true
- }
- },
- computed: {
- link () {
- return ensureExt(this.item.link)
- },
- exact () {
- if (this.$site.locales) {
- return Object.keys(this.$site.locales).some(rootLink => rootLink === this.link)
- }
- return this.link === '/'
- },
- isNonHttpURI () {
- return isMailto(this.link) || isTel(this.link)
- },
- isBlankTarget () {
- return this.target === '_blank'
- },
- isInternal () {
- return !isExternal(this.link) && !this.isBlankTarget
- },
- target () {
- if (this.isNonHttpURI) {
- return null
- }
- if (this.item.target) {
- return this.item.target
- }
- return isExternal(this.link) ? '_blank' : ''
- },
- rel () {
- if (this.isNonHttpURI) {
- return null
- }
- if (this.item.rel) {
- return this.item.rel
- }
- return this.isBlankTarget ? 'noopener noreferrer' : ''
- }
- },
- methods: {
- focusoutAction () {
- this.$emit('focusout')
- }
- }
- }
- </script>
|