【问题标题】:Vue: Child string prop wont renderVue:子字符串道具不会呈现
【发布时间】:2020-03-26 12:58:40
【问题描述】:

您好,我是 vue 新手,正在尝试了解它的单向数据绑定模型组件注册和传递道具。

在我的index.js 中有我的父组件,我现在想在其中渲染一个子组件

import Vue from 'vue'
import StyledTitle from './components/StyledTitle'

new Vue({
  el: '#app',
  components: {
    StyledTitle,
  },
})

子组件是StyledTitle.js

import Vue from 'vue'
import styled from 'vue-styled-components'

const StyledTitle = styled.h1`
  font-size: 1.5em;
  text-align: center;
  color: #ff4947;
  &:hover,
  &:focus {
    color: #f07079;
  }
`

Vue.component('styled-title', {
  props: ['text'],
  components: {
    'styled-title': StyledTitle,
  },
  template: `<StyledTitle>{{ text }}</StyledTitle>`,
})

export default StyledTitle

最后我的 HTML 是我希望呈现红色的 Hi

<div id="app">
   <styled-title text="Hi"></styled-title>
</div>

虽然没有显示 HI,并且 props 值未定义。从反应过来,所以想知道为什么这不起作用,谢谢!

ps我的vue devtools截图

【问题讨论】:

  • @MarkMeyer 控制台中没有与应用程序相关的错误。不过,我将添加我的 vue devtools 的屏幕截图。 const StyledTitle = styled.h1`` 是声明样式组件的方式。
  • 您是否有理由将text 作为道具传递,而不是仅将其设置在默认插槽中?
  • @Phil Component def 如果我只是在开始标签和结束标签之间传递 Hi 就可以工作,但我想让道具适用于未来我可能有更多动态内容的情况,而不仅仅是来自API 或其他一些数据对象

标签: javascript vue.js vuejs2


【解决方案1】:

问题在于您的 StyledTitle.js 文件导出了一个普通样式的 &lt;h1&gt; 组件,该组件使用默认插槽作为其内容,而不是接受 text 属性的自定义组件。

如果您仍然热衷于使用基于 prop 的组件,则需要导出它而不是来自 vue-styled-components 的那个。在这种情况下,您也应该避免全局组件注册。

例如

// StyledTitle.js
import styled from 'vue-styled-components'

// create a styled title locally
const Title = styled.h1`
  font-size: 1.5em;
  text-align: center;
  color: #ff4947;
  &:hover,
  &:focus {
    color: #f07079;
  }
`

// now export your custom wrapper component
export default {
  name: 'StyledTitle',
  props: ['text'],
  components: {
    Title, // locally register your styled Title as "Title"
  },
  template: `<Title>{{ text }}</Title>`,
})

鉴于您的组件不维护任何状态,您可以将其设为purely functional。使用渲染函数也会有所帮助,特别是如果您的 Vue 运行时不包含模板编译器(这是大多数 Vue CLI 应用程序的默认设置)

export default {
  name: 'StyledTitle',
  functional: true,
  props: { text: String },
  render: (h, { props }) => h(Title, props.text)
}

【讨论】:

  • 非常感谢这个工作,Vue 在文档中是否有任何你知道的概述这种模式的内容?我不太明白他们在 props 下的文档中的内容。
  • @gwar9 我不太清楚你说的“这种模式”是什么意思。
  • 我想这是一个 vue 风格的组件,而不是一个 vue 组件的东西。通过模式,我想知道您设置组件名称、道具、要使用的组件及其模板的导出默认对象,而不是像我尝试做的那样使用 Vue.Component。
  • 使用Vue.component() registers your component globally。您所拥有的以及我在回答中所拥有的是在StyledTitle.js 中创建和导出的组件,可以通过local registration 在其他组件中导入和使用。组件只是具有propstemplatecomponents 等属性的对象。name 属性并不是特别重要,仅真正用于调试。
猜你喜欢
  • 2018-10-21
  • 2022-07-06
  • 2020-08-06
  • 1970-01-01
  • 2020-01-17
  • 2020-06-27
  • 1970-01-01
  • 2020-12-26
  • 2019-06-20
相关资源
最近更新 更多