Что такое JSX
JSXэтоJavascriptграмматическое расширение ,JSX = Javascript + XML, то есть вJavascriptнаписать внутриXML,потому чтоJSXЭто свойство , поэтому он имеетJavascriptгибкость и одновременноhtmlСемантический и интуитивно понятный
Зачем использовать JSX с Vue
Иногда мы используем функцию рендеринга (render function) В абстрактные компоненты, функция рендеринга не очень понятна, чтобы увидетьофициальная документация, а функции рендеринга иногда очень больно писать, например:
createElement(
'anchored-heading', {
props: {
level: 1
}
}, [
createElement('span', 'Hello'),
' world!'
]
)
Соответствующий шаблон выглядит следующим образом:
<anchored-heading :level="1">
<span>Hello</span> world!
</anchored-heading>
Это явно неблагодарно, на этот раз отправитьJSXИграл. существуетVueиспользуется вJSX, Необходимо использоватьBabel плагинЭто позволяет обратно ближе к синтаксису шаблона, а затем начнем начатьVueНапишитеJSXБар
Начинать
Использование для быстрого чтенияvue-cliСоздать проект Vue:
# 直接回车即可
vue create vue-jsx
Установите зависимости:
npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props
настроить.babelrc:
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset',
'@vue/babel-preset-jsx'
]
}
Duplicate declaration "h" (This is an error on an internal node. Probably an internal error.)
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset',
['@vue/babel-preset-jsx',
{
'injectH': false
}]
]
}
Вот какVueНапишите базовое содержимое в , включая обычный текст, динамическое содержимое, использование тегов и использование пользовательских компонентов, которые аналогичны однофайловым компонентам, которые мы обычно используем, как показано ниже:
Уведомление:JSXВерхний слой может иметь только один корневой элемент
render() {
return (
<div>
<h3>内容</h3>
{/* 纯文本 */}
<p>hello, I am Gopal</p>
{/* 动态内容 */}
<p>hello { this.msg }</p>
{/* 输入框 */}
<input />
{/* 自定义组件 */}
<myComponent></myComponent>
</div>
);
}
Attributes/Props
стабильныйAttributesСвязывание с обычнымHTML Attributesта же структура
render() {
return <div><input placeholder="111" /></div>
}
Обратите внимание, что если свойство является динамическим, передv-bind:placeholder="this.placeholderText"сталplaceholder={this.placeholderText},Следующим образом
render() {
return <input
type="email"
placeholder={this.placeholderText}
/>
}
render (createElement) {
return (
<button {...this.largeProps}></button>
)
}
картинаinputтег, вы можете привязывать свойства в пакетах следующим образом
const inputAttrs = {
type: 'email',
placeholder: 'Enter your email'
};
render() {
return <input {...{ attrs: inputAttrs }} />
}
слот
Для ознакомления со слотами см. мою другую статью[Vue Advanced] От слота до компонента без рендеринга
Мы смотрим, как использоватьJSXРеализация именованных слотов и слотов с ограниченной областью действия
именованный слот: Аналогичная формулировка и родительский компонент шаблона однофайловой сборки отslot="header"这样方式指定要插入的位置。 дочерний компонент через{this.$slots.header}способ указать имя слота, гдеheaderЭто имя слота, родительский и дочерний компоненты нуждаются во взаимно однозначном соответствии.
Примечание: здесь нельзя использоватьv-slotинструкция
Родительский компонент:
render() {
{/* 具名插槽 */}
<myComponent>
<header slot="header">header</header>
<header slot="content">content</header>
<footer slot="footer">footer</footer>
</myComponent>
}
Сборка:
render() {
return (
<div>
{/* 纯文本 */}
<p>我是自定义组件</p>
{this.$slots.header}
{this.$slots.content}
{this.$slots.footer}
</div>
);
}
слот с прицелом: передается в дочерний компонент{this.$scopedSlots.test({ user: this.user })}Имя указанного слотаtest, и воляuserпередается на родительский компонент. Когда родительский компонент записывает метку дочерней компоненты, пропуститеscopedSlotsЗначение, указывающее, куда вставитьtestи получить входящий подкомпонент в функции обратного вызоваuserстоимость
Примечание. Слоты с заданной областью записываются в тегах подкомпонентов, как и свойства. вместо того, чтобы помещать его внутри метки, как именованный слот
Родительский компонент:
render() {
{/* 具名插槽 作用域插槽 */}
<myComponent {
...{
scopedSlots: {
test: ({user}) => (
<div>{user.name}</div>
)
}
}
}>
</myComponent>
}
Сборка:
render() {
return (
<div>
{this.$scopedSlots.test({
user: this.user
})}
</div>
);
}
инструкция
render() {
{/* 指令 */}
{/* v-model */}
<div><input vModel={this.newTodoText} /></div>
{/* v-model 以及修饰符 */}
<div><input vModel_trim={this.tirmData} /></div>
{/* v-on 监听事件 */}
<div><input vOn:input={this.inputText} /></div>
{/* v-on 监听事件以及修饰符 */}
<div><input vOn:click_stop_prevent={this.inputText} /></div>
{/* v-html */}
<p domPropsInnerHTML={html} />
}
Описание официального сайта, создать новыйFunctionalComponent.jsфайл со следующим содержимым:
export default ({ props }) => <p>hello {props.message}</p>
Родительский компонент вызывается следующим образом:
import funComponent from './FunctionalComponent'
...
render() {
return {/* 函数式组件 */}
<funComponent message="Gopal"></funComponent>
}
Суммировать
В этой статье в основном рассказывается, почемуVueиспользуется вJSX, и какVueиспользуется вJSX
Все примеры из этой статьи здесьгитхаб-адрес, так разбито сердце, попроси комплимент~
В целом, вVue 2.Xверсия, написанная наJSXЭто немного неблагодарно, и я наступлю на много ям .... С нетерпением ждуVue3
Надеюсь, это поможет всем~
- Самый мощный макет CSS — макет сетки
- Как написать полное приложение Vue с помощью Typescript
- Инструмент веб-отладки, который должен знать внешний интерфейс — свисток