dojo 龙形主 logo

设置小部件的属性

小部件的属性会自动从自定义元素中暴露出来,作为属性、事件或属性。

以下 EmailSignup 小部件包含几种不同的属性类型。

src/widgets/EmailSignup.tsx

import { tsx, create } from '@dojo/framework/core/vdom';
import * as css from './styles/EmailSignup.m.css';
import icache from '@dojo/framework/core/middleware/icache';

export interface EmailSignupProperties {
	title?: string;
	onSignUp?: () => void;
	signUpBonusDate?: Date;
	successMessages?: string[];
}

function randomEntry(arr: string[]) {
	return arr[Math.floor(Math.random() * arr.length)];
}

const factory = create({ icache }).properties<EmailSignupProperties>();

export default factory(function EmailSignup({ middleware: { icache }, properties }) {
	const { title, signUpBonusDate, successMessages } = properties();

	const signedUp = icache.getOrSet('signedUp', false);
	const signUp = () => {
		const { onSignUp } = properties();

		// post email address to a server
		icache.set('signedUp', true);
		icache.set('successMessage', successMessages ? randomEntry(successMessages) : 'Thank you for signing up!');
		onSignUp && onSignUp();
	};

	return (
		<div key="root" classes={css.root}>
			<div key="title" classes={css.title}>
				{title || 'Subscribe Now'}
			</div>
			{signedUp ? (
				<div key="confirmation" classes={css.thanks}>
					{icache.get('successMessage')}
				</div>
			) : (
				<div key="signup" classes={css.signup}>
					{signUpBonusDate && <div>Sign up by {signUpBonusDate.toLocaleDateString()}</div>}
					<input type="text" />
					<button onclick={signUp}>Sign Up</button>
				</div>
			)}
		</div>
	);
});

属性

string 和对象类型的 widget 属性会自动作为 HTML 属性添加到您的自定义元素中。继续以电子邮件订阅示例为例,title 属性 ({ title?: string }) 可以通过向 HTML 添加 title 属性来定制。由于 title 是一个字符串属性,因此 HTML 属性的值将用作 title 属性的值,无需转换。

<ref-email-signup id="emailSignup" title="Subscribe to Our Newsletter"></ref-email-signup>

其他可序列化属性,如数组和配置对象,可以通过传递序列化 JSON 来通过 HTML 属性设置。sucessMessages 属性 ({ successMessages?: string[] }) 可以通过向 HTML 添加 successmessages 属性来设置。

<ref-email-signup
  id="emailSignup"
  title="Subscribe to Our Newsletter"
  successmessages='["Thanks!","Thank you for signing up","You are the best!"]'
></ref-email-signup>

此处,successmessages 属性的值将被反序列化并设置为 successMessages 属性。

请注意,如果属性的值不是有效的 JSON,则不会设置属性

事件

on 开头并具有函数签名的 widget 属性会作为事件暴露出来。发出的事件是属性名称的小写部分,不带 "on"。监听 onSignUp 属性 ({ onSignUp?: () => void }) 将如下所示。

<script>
    emailSignup.addEventListener('signup', () => {
        // start confetti animation 🎉
    });
</script>

属性

所有非事件 widget 属性都会自动作为自定义元素上的属性创建。这些属性可以通过 JavaScript 完全控制。在电子邮件订阅小部件中,titlesignUpBonusDate 属性都可以通过编程方式作为属性设置。

<script>
        const now = new Date();
        emailSignup.signUpBonusDate = new Date(
            now.getFullYear(),
            now.getMonth(),
            now.getDate() + 1
        );
    </script>