首页 > 其他分享 >庆军之blazor动态组件的研究与总结

庆军之blazor动态组件的研究与总结

时间:2023-06-27 17:44:59浏览次数:36  
标签:parameters 庆军 component entry 组件 new blazor Type public

只上代码:

rootcontrol.ControlParams = new Dictionary<string, object>();
rootcontrol.ControlParams["a"] = "ssss";
rootcontrol.Children.Add(new MControlParam()
{
ControlType = typeof(Layout),
ControlParams = new Dictionary<string, object>()
{
{ "Class", "page" },
{"ChildContent",new RenderFragment(childBuilder0 =>{
new MDynamicComponent(typeof(Button),new Dictionary<string, object>()
{
{ "OnClick",EventCallback.Factory.Create(this,this.fuckabc)},
{"ChildContent",new RenderFragment(childBuilder =>
{
timeTemplate(childBuilder);
childBuilder.AddContent(0, "第一个按钮");
})}
})._cachedRenderFragment(childBuilder0);

new MDynamicComponent(typeof(Button),new Dictionary<string, object>()
{
{"Block",false},
{"ChildContent",new RenderFragment(childBuilder =>
{
timeTemplate(childBuilder);
childBuilder.AddContent(0, "第二个按钮");
})}
})._cachedRenderFragment(childBuilder0);
})
}


});

 

public class MDynamicComponent : IComponent
{
private RenderHandle _renderHandle;
public readonly RenderFragment _cachedRenderFragment;

/// <summary>
/// Constructs an instance of <see cref="DynamicComponent"/>.
/// </summary>
public MDynamicComponent()
{
_cachedRenderFragment = Render;
}

public MDynamicComponent(Type type, IDictionary<string, object> parameters)
: this()
{
Type = type;
Parameters = parameters;
}

 

/// <summary>
/// Gets or sets the type of the component to be rendered. The supplied type must
/// implement <see cref="IComponent"/>.
/// </summary>
[Parameter]
//[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
//[EditorRequired]
public Type Type { get; set; } = default!;

/// <summary>
/// Gets or sets a dictionary of parameters to be passed to the component.
/// </summary>
// Note that this deliberately does *not* use CaptureUnmatchedValues. Reasons:
// [1] The primary scenario for DynamicComponent is where the call site doesn't
// know which child component it's rendering, so it typically won't know what
// set of parameters to pass either, hence the developer most likely wants to
// pass a dictionary rather than having a fixed set of parameter names in markup.
// [2] If we did have CaptureUnmatchedValues here, then it would become a breaking
// change to ever add more parameters to DynamicComponent itself in the future,
// because they would shadow any coincidentally same-named ones on the target
// component. This could lead to application bugs.
[Parameter]
public IDictionary<string, object>? Parameters { get; set; }

/// <summary>
/// Gets rendered component instance.
/// </summary>
public object? Instance { get; private set; }

/// <inheritdoc />
public void Attach(RenderHandle renderHandle)
{
_renderHandle = renderHandle;
}

/// <inheritdoc />
//[UnconditionalSuppressMessage("Trimming", "IL2072", Justification = "We expect that types used with DynamicComponent will be defined in assemblies that don't get trimmed.")]
public Task SetParametersAsync(ParameterView parameters)
{
// This manual parameter assignment logic will be marginally faster than calling
// ComponentProperties.SetProperties.
foreach (var entry in parameters)
{
if (entry.Name.Equals(nameof(Type), StringComparison.OrdinalIgnoreCase))
{
Type = (Type)entry.Value;
}
else if (entry.Name.Equals(nameof(Parameters), StringComparison.OrdinalIgnoreCase))
{
Parameters = (IDictionary<string, object>)entry.Value;
}
else
{
throw new InvalidOperationException(
$"{nameof(MDynamicComponent)} does not accept a parameter with the name '{entry.Name}'. To pass parameters to the dynamically-rendered component, use the '{nameof(Parameters)}' parameter.");
}
}

if (Type is null)
{
throw new InvalidOperationException($"{nameof(MDynamicComponent)} requires a non-null value for the parameter {nameof(Type)}.");
}

_renderHandle.Render(_cachedRenderFragment);
return Task.CompletedTask;
}

void Render(RenderTreeBuilder builder)
{
builder.OpenComponent(0, Type);

if (Parameters != null)
{
foreach (var entry in Parameters)
{
builder.AddAttribute(1, entry.Key, entry.Value);
}
}

builder.AddComponentReferenceCapture(2, component => Instance = component);

builder.CloseComponent();
}
}

 

开始研究vue.js的render.

标签:parameters,庆军,component,entry,组件,new,blazor,Type,public
From: https://www.cnblogs.com/forhell/p/17509523.html

相关文章

  • VUE框架组件中通信方式(3)
    useAttrs使用方式类似于props传值,useAttrs既可以传数据,也可以传事件。如果父组件给子组件传递的参数,在子组件中同时使用props和useAttrs获取,那么参数只在props中生效,也就是说props的优先级高于useAttrs。示例代码如下://template><div><h1>useAttrs</h1><el-but......
  • 【HarmonyOS】低代码开发使用module中的自定义组件
     “Module是应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。一个HarmonyOS应用/服务通常会包含一个或多个Module,因此,可以在工程中创建多个Module,每个Module分为Ability和Library两种类型。”这个是HarmonyOS......
  • react的函数式组件中使用ref获取到子组件的方法为undefined
    我暂时遇到了两种情况。第一种情况:useImperativeHandle函数写错useImperativeHandle的第二个参数的返回值是作为ref.current的值,但是我写箭头函数写快了,忘记返回值了。useImperativeHandle(ref,()=>{foo},[foo])//错误,这样没有返回值,所以ref.current为undefineduseImp......
  • Vue如何在页面加载时将url的参数赋值给组件
    <template> <inputv-model="loginForm.username" name="username" type="text" tabindex="1" auto-complete="on" /><inputv-model="loginForm.password":type="passwordType"......
  • 前端Vue自定义加载中loading加载结束end组件 可用于分页展示 页面加载请求
    前端Vue自定义加载中loading加载结束end组件可用于分页展示页面加载请求,请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13219效果图如下:实现代码如下:cc-paging使用方法<!--加载中用法isLoading:是否加载isEnd:是否结束加载--><cc-paging:isLoad......
  • 【Vue3】Vue3中常用的组件传参方式
    props/$emit父传子(自定义属性props)//父组件代码<Son:name="test"/>//子组件代码<div>{{name}}</div>props:{name:{type:String,default:"default",},}子传父(自定义this.$emit)//子组件代码<button@click=&qu......
  • 【Vue】Vue3+Vite 实现 SVG 组件自动加载 icons 目录下所有文件
    1.安装依赖插件vite-plugin-svg-iconsvite-plugin-svg-icons用于生成svg雪碧图。特点:1.预加载在项目运行时就生成所有图标,只需操作一次dom2.高性能内置缓存,仅当文件被修改时才会重新生成vite-plugin-svg-icons官方文档pnpmaddvite-plugin-svg-icons2.安装......
  • 【TypeScript】Element 组件导入在 TypeScript 5 报错:模块 ““element-plus““ 没有
    报错现象解决方法typescript5.0版本升级,使用了compilerOptions.moduleResolution:"bundler"的模块编译选项。moduleResolution:模块解析策略,是指编译器在查找导入模块内容时所遵循的流程因此目前要解决报错,我们只需要修改tsconfig.json下的为node就行。/*Bundle......
  • form组件
    form组件在我们日常填写注册信息或者报名信息时,所访问的网页,在输入信息有错误时就显示一些后端传入的提示。我们当然可以通过ajax绑定事件来从后端取一些提示,但是表单是个整体,如果每个输入框都需要我们完整的写一轮这么一套逻辑,这就太麻烦了,所以针对表单标签,django提供了form组......
  • 【HarmonyOS】低代码项目中设置拖拽组件背景色透明度问题
    【关键字】HarmonyOS、低代码开发、拖拽组件、背景色透明度【问题描述】使用拖拽式组件开发HarmonyOS项目时,想给组件设置背景色透明度,有如下几个问题:1)使用DevEcoStudio自带的颜色选择器,无法设置透明度,只能手动输入2)在子模块library中给组件手动输入#ff000000格式背景色,在主模块ent......