官术网_书友最值得收藏!

Dynamic component

Now, it is time to put all of these into our overlay component and use the activeOverlay property we defined earlier.

  1. Add the components and display them with the corresponding value of activeOverlay in the main template:
      <overlay v-if="activeOverlay">
<overlay-content-player-turn
v-if="activeOverlay === 'player-turn'" />
<overlay-content-last-play
v-else-if="activeOverlay === 'last-play'" />
<overlay-content-game-over
v-else-if="activeOverlay === 'game-over'" />
</overlay>

We will remove the overlay completely if the activeOverlay property is equal to null.

Before adding the props, we will need to modify the app state in the state.js file with a few getters.

  1. The first one will return the player object from the currentPlayerIndex property:
      get currentPlayer () {
return state.players[state.currentPlayerIndex]
},
  1. The second one will return the opposing player index:
      get currentOpponentId () {
return state.currentPlayerIndex === 0 ? 1 : 0
},
  1. Finally, the third one will return the corresponding player object:
      get currentOpponent () {
return state.players[state.currentOpponentId]
},
  1. Now, we can add the props to the overlay contents:
      <overlay v-if="activeOverlay">
<overlay-content-player-turn
v-if="activeOverlay === 'player-turn'"
:player="currentPlayer" />
<overlay-content-last-play
v-else-if="activeOverlay === 'last-play'"
:opponent="currentOpponent" />
<overlay-content-game-over
v-else-if="activeOverlay === 'game-over'"
:players="players" />
</overlay>

You can test the overlays by setting the activeOverlay property in the browser console:

state.activeOverlay = 'player-turn'
state.activeOverlay = 'last-play'
state.activeOverlay = 'game-over'
state.activeOverlay = null

If you want to test the last-play overlay, you need to specify a valid value to the player lastPlayedCardId property, such as 'catapult' or 'farm'.

Our code is starting to be messy, with three conditionals. Thankfully, there is a special component that can turn itself into any component--it is the component component. You just have to set its is prop to a component name, a component definition object, or even an HTML tag, and it will morph into it:

<component is="h1">Title</component>
<component is="overlay-content-player-turn" />

It's a prop like any other, so we can use the v-bind directive to dynamically change the very nature of the component with a JavaScript expression. What if we used our activeOverlay property to do just that? Are our overlay content components conveniently named with the same 'over-content-' prefix? Take a look:

<component :is="'overlay-content-' + activeOverlay" />

That's it. Now, by changing the value of the activeOverlay property, we will change the component displayed inside the overlay.

  1. After adding back the props, the overlay should look like this in the main template:
      <overlay v-if="activeOverlay">
<component :is="'overlay-content-' + activeOverlay"
:player="currentPlayer" :opponent="currentOpponent"
:players="players" />
</overlay>

Don't worry, unused props won't interfere with the different overlays workings.

主站蜘蛛池模板: 阳春市| 沙坪坝区| 克什克腾旗| 灵山县| 忻州市| 林芝县| 新宾| 通州市| 措勤县| 屯留县| 大连市| 建昌县| 长沙县| 扶沟县| 阿瓦提县| 阿拉善左旗| 新和县| 武定县| 平塘县| 威信县| 凤凰县| 南城县| 钟祥市| 凤阳县| 台中县| 秦安县| 沽源县| 刚察县| 昌乐县| 涞源县| 肥城市| 渑池县| 慈利县| 和静县| 枞阳县| 海兴县| 甘孜| 中牟县| 承德县| 余干县| 洪江市|